c - 从 C 中的函数内部分配一个字符串数组

标签 c memory-management segmentation-fault

我有一个函数可以扫描文件并返回行数以及字符串数组中的行,我的函数如下所示:

int load_lines(char* _file, char** _array){
    FILE *infile;
    char line_buffer[BUFSIZ];
    char line_number;

    infile = fopen(_file, "r");

    ine_number = 0;
    while (fgets(line_buffer, sizeof(line_buffer), infile)) 
        ++line_number;

    fclose(infile);
    _array = malloc (line_number * sizeof(char*));
    infile = fopen(_file, "r");
    line_number = 0;

    while (fgets(line_buffer, sizeof(line_buffer), infile)) {
        _array[line_number] = malloc(strlen(line_buffer) + 1);
        strcpy(_array[line_number], line_buffer);

        //a printf on _array[line_number] works fine here
        ++line_number;
    }

    return line_number;
}

当我这样调用它时:

char** _array;
line_number = load_lines(inname, _array);

_array[0];

我得到一个段错误,因为数组似乎在函数返回后没有分配。

最佳答案

当您将参数传递给函数时,函数总是在该参数的副本上工作。

因此在您的情况下,load_lines 正在处理 _array 的副本。原始的_array没有被修改:

char** _array = NULL;
printf("%p\n", _array); // Prints "0x0000"
line_number = load_lines(inname, _array);
printf("%p\n", _array); // Prints "0x0000"

要修改_array,您需要传递一个指向它的指针:

int load_lines(char* _file, char*** _array){
    ...
    (*array) = malloc (line_number * sizeof(char*));
    ...
    (*array)[line_number] = malloc(strlen(line_buffer) + 1);
}

char** _array = NULL;
line_number = load_lines(inname, &_array);

[但是,每当您发现自己需要三重指针(即 ***)时,就该重新考虑您的架构了。]

关于c - 从 C 中的函数内部分配一个字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6548380/

相关文章:

c++ - 段错误澄清

c++ - 聚合方法中的 sigsegv 错误

ios - 将图像保存为 nsdata 到 plist 并接收内存警告

c - 运算符 == 在 C 中不起作用

c - 在 C 中仅使用递归函数和递增进行乘法

c - SIMD 内在函数 - 段错误

c - 如何释放内存?

c - 我应该在我的 C 代码中检测 OOM(内存不足)错误吗?

c - 使用 fgets() 读取文件最后一行时出现段错误

c - MISRA C 2012 规则 16.1 所有 switch 语句都应格式正确