Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C FPUT上的分段错误_C_File_Recursion_Segmentation Fault_Fputs - Fatal编程技术网

C FPUT上的分段错误

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,输入)

一般来说,我对C语言和内存分配是相当陌生的。基本上,我试图做的是复制未知大小的输入文件的内容,并使用递归反转其内容。我觉得我很接近,但当我尝试输入我认为是文件反向内容的内容时,我总是遇到分段错误(我认为我这样做是对的……)

#包括
#包括
#包括
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));