我有一个函数可以扫描文件并返回行数以及字符串数组中的行,我的函数如下所示:
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/