我正在做的就是在c(char * )中启动一个双指针来保存我的字符串数组。我将此变量(char * array_strings)传递给另一个函数,该函数应该打开一个文件并创建一个表示文件每一行的字符串数组,但由于某种原因,当我从函数返回时,变量array_strings为null。
int main(void) {
char **array_strings;
char *book_file = "book.txt";
delimitByNewline(book_file, array_strings);
return 1;
}
//delimit file
void delimitByNewline(char *book, char **array) {
int count = 0;
int i = 0;
char c;
int size = fileLines(book);
srand(time(NULL));
char **ret_array = (char **)malloc(sizeof(char *) * size);
FILE *bk = fopen(book, "rt");
if(!bk) {
perror("fp");
exit(1);
}
char *line = (char *)malloc(sizeof(char)*60);
while ((c = fgetc(bk)) != EOF) {
line[i] = c;
i++;
if(c == '\n') {
ret_array[count] = line;
line = (char *)malloc(sizeof(char) * i);
count++;
i = 0;
}
}
fclose(bk);
array = ret_array;
free(line);
free(ret_array);
}
答案 0 :(得分:4)
由于您要在函数中分配集合,因此需要将其返回给调用者。
我建议将退货签名从void
更改为char **
并将流程更改为:
char** delimitByNewline(char* book){
char** ret_array = (char **)malloc(sizeof(char *)*size);
// .. assign the strings, don't free!
return ret_array;
}
并且如此调用:
char* book_file = "book.txt";
char** array_strings = delimitByNewline(book_file);
(请注意@ JonathanLeffler的评论 - 堆分配ret_array
的所有权传回给来电者 - 即来电者必须free
,而不是delimitByNewLine()
。!)
修改强>
如果你真的想把数组作为out参数传递,你需要传递原始指针的地址,因为函数需要它来分配malloc
ed数组的地址,即:
char **array_strings = 0; // NULL
char *book_file = "book.txt";
delimitByNewline(book_file, &array_strings);
// do stuff
// free strings + array
然后需要取消引用它来分配它。
void delimitByNewline(char *book, char ***array) {
*array = (char **)malloc(sizeof(char *) * size);
// ... Don't free
答案 1 :(得分:1)
在函数void delimitByNewline(char* book,char** array)
中,参数类型不正确。您正在传递地址并写入char *
&的类型char **
。
FILE *bk = fopen(book,"rt");
文件访问模式中的t
是什么?