C FPUT上的分段错误
一般来说,我对C语言和内存分配是相当陌生的。基本上,我试图做的是复制未知大小的输入文件的内容,并使用递归反转其内容。我觉得我很接近,但当我尝试输入我认为是文件反向内容的内容时,我总是遇到分段错误(我认为我这样做是对的……)C FPUT上的分段错误,c,file,recursion,segmentation-fault,fputs,C,File,Recursion,Segmentation Fault,Fputs,一般来说,我对C语言和内存分配是相当陌生的。基本上,我试图做的是复制未知大小的输入文件的内容,并使用递归反转其内容。我觉得我很接近,但当我尝试输入我认为是文件反向内容的内容时,我总是遇到分段错误(我认为我这样做是对的……) #包括 #包括 #包括 int递归返回(字符**行,int行号,文件*输入){ char*input_line=malloc(sizeof(char)*1000); 行=realloc(行,(行号)*1000*sizeof(字符)); 如果(fgets(输入线,201,输入)
#包括
#包括
#包括
int递归返回(字符**行,int行号,文件*输入){
char*input_line=malloc(sizeof(char)*1000);
行=realloc(行,(行号)*1000*sizeof(字符));
如果(fgets(输入线,201,输入)=NULL){
*(行+行号)=输入行;
返回1;
}
否则{
printf(“%d\n”,行号);
返回(1+递归返回(行,+行号,输入));
}
}
向后作废(文件*输入,文件*输出,int调试标志){
int i;
char**lines;//在此处存储行
lines=malloc(1000*sizeof(char*);//1000行
if(lines==NULL){//if malloc失败
fprintf(stderr,“行的malloc失败\n”);
出口(1);
}
int finalLineCount,lineCount;
finalLineCount=递归返回(行,0,输入);
printf(“测试%d\n”,最终计数);
对于(i=finalLineCount;i>0;i--){
fputs(*(行+i),输出);//此处为SEGFULT
}
}
我使用一个简单的输入文件来测试代码。我的输入文件有6行,上面写着“这是一个测试输入文件”。实际的输入文件正在另一个函数中打开,并传递给backward函数。我已经验证了我的程序中的其他功能工作,因为我一直在玩不同的选项。这两个函数是我唯一遇到麻烦的函数。我做错了什么?你的问题是:
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));
正如@ooga所说。它至少有三个不同的问题:
recursive\u back()
的局部变量行
指向的内存块,并将新地址(假设重新分配成功)存储回该局部变量。新位置不一定与旧位置相同,但指向它的唯一指针是一个局部变量,该变量在recursive\u back()
末尾超出范围。调用者的相应变量不会更改(包括调用者本身是recursive\u back()
时),因此在recursive\u back()
返回后,不能再依赖它作为有效指针char**
,因此它指向的对象具有类型char*
,但您将根据char
的大小保留空间lineNumber
为零时,您没有预留足够的空间,至少在第一次通话时是这样。在该调用中,当请求的空间正好为零字节时,realloc()
的作用是释放行所指向的内存。在随后的调用中,分配的空间总是比您认为分配的空间少一行
看起来,如果你可以依靠输入最多有1000行,那么<>代码> RealCube()/代码>完全是不必要的,所以你应该考虑删除它。如果您确实需要能够以调用者可以看到的方式重新分配,那么调用者需要传递一个指向其变量的指针,以便
recursive\u back()
可以通过该指针修改它。在分配到行时误用realloc
(您已经为1000个指针分配了足够的空间)。无论如何,如果您真的要在函数中重新分配到行
,那么它需要是一个三重指针(即字符***行
,并且您分配给*行
),否则更改将在调用程序中不可见。segfault时的最终计数标记为7(比我的文件输入的总行数多1行)。
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));