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

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

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正在处理load_lines的副本。 原始的_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); 

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

如果要从函数返回新分配的字符串数组,则函数的第二个参数必须具有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);