从C中的函数内部分配字符串数组

时间:2011-07-01 13:11:15

标签: 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];

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

2 个答案:

答案 0 :(得分:6)

将参数传递给函数时,函数始终对该参数的副本起作用。

因此,在您的情况下,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);

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

答案 1 :(得分:2)

如果要从函数返回新分配的字符串数组,则函数的第二个参数必须具有char***类型,例如。指向字符串数组的指针:

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

当你调用函数时:

char** _array;
line_number = load_hosts(inname, &_array);