从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);