我对C和内存分配一般都很陌生。基本上我要做的是复制未知大小的输入文件的内容并使用递归来反转它的内容。我觉得我非常接近,但是当我试图输入我认为是文件的反转内容的内容时,我一直遇到分段错误(我认为因为我认为我做得对... )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int recursive_back(char **lines, int lineNumber, FILE *input) {
char *input_line = malloc(sizeof(char) * 1000);
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));
if(fgets(input_line, 201, input) == NULL) {
*(lines + lineNumber) = input_line;
return 1;
}
else {
printf("%d\n", lineNumber);
return (1+recursive_back(lines, ++lineNumber, input));
}
}
void backward (FILE *input, FILE *output, int debugflag ) {
int i;
char **lines; //store lines in here
lines = malloc(1000 * sizeof(char *) ); //1000 lines
if(lines == NULL) { //if malloc failed
fprintf(stderr, "malloc of lines failed\n");
exit(1);
}
int finalLineCount, lineCount;
finalLineCount = recursive_back(lines, 0, input);
printf("test %d\n", finalLineCount);
for(i = finalLineCount; i > 0; i--) {
fputs(*(lines+i), output); //segfault here
}
}
我使用简单的输入文件来测试代码。我的输入文件是6行,表示&#34;这是一个测试输入文件&#34;。实际的输入文件在另一个函数中打开并传递给后向函数。我已经验证了我的程序中的其他功能,因为我一直在玩不同的选项。这两个功能是我遇到麻烦的唯一功能。我做错了什么?
答案 0 :(得分:0)
你的问题在这里:
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));
正如@ooga说的那样。它至少有三个不同的错误:
您正在重新分配recursive_back()
本地变量 lines
指向的内存块,并存储新地址(假设重新分配)成功)回到那个局部变量。新位置不一定与旧位置相同,但指向它的唯一指针是在recursive_back()
末尾超出范围的局部变量。调用者的相应变量不会改变(包括调用者本身为recursive_back()
时),因此在recursive_back()
返回后不能再依赖它作为有效指针。
使用错误的类型分配空间。 lines
的类型为char **
,因此它指向的对象的类型为char *
,但您要根据char
的大小预留空间。
lineNumber
为零时,至少在第一次通话时,您没有预留足够的空间。在该调用中,当请求的空间正好是零字节时,realloc()
的效果是释放 lines
指向的内存。在随后的通话中,分配的空间总是比您认为分配的价值低一行。
如果您可以依赖输入最多拥有1000行,那么realloc()
似乎完全没必要,所以您应该考虑删除它。如果你真的需要能够以调用者将看到的方式重新分配,那么调用者需要将指针传递给它的变量,以便recursive_back()
可以通过它来修改它指针。