首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >fputs上的分割故障

fputs上的分割故障
EN

Stack Overflow用户
提问于 2015-07-01 01:52:36
回答 1查看 1.3K关注 0票数 0

一般情况下,我对C和内存分配非常陌生。基本上,我要做的是复制未知大小的输入文件的内容,并使用递归反转它的内容。我觉得我很接近,但是当我试图把我认为是文件的反向内容的内容放进去时,我总是会有一个分割错误(我想是因为我认为我做得对……)

代码语言:javascript
运行
复制
#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行长,上面写着“这是一个测试输入文件”。实际输入文件将在另一个函数中打开并传递给向后函数。我已经证实了我的程序中的其他功能,因为我一直在玩不同的选择。这两个函数是我唯一有困难的功能。我做错了什么?

EN

Stack Overflow用户

回答已采纳

发布于 2015-07-01 02:48:49

你的问题是:

代码语言:javascript
运行
复制
lines = realloc(lines, (lineNumber) * 1000 * sizeof(char));

就像胡加说的那样。它至少有三种不同的问题:

  1. 您正在重新分配recursive_back()的局部变量lines所指向的内存块,并将新地址(假设重新分配成功)存储到该局部变量中。新位置不一定与旧的位置相同,但指向它的唯一指针是在recursive_back()结束时超出作用域的局部变量。调用者的相应变量不会更改(包括调用方本身是recursive_back()本身),因此在recursive_back()返回后不再依赖于它是有效指针。
  2. 使用错误的类型分配空间。lineschar **类型,因此它指向的对象具有char *类型,但是您将根据char的大小来保留空间。
  3. lineNumber为零时,您没有预留足够的空间,至少在第一次调用时是这样。在该调用中,当请求的空间完全为零字节时,realloc()的效果是释放lines所指向的内存。在随后的调用中,所分配的空间总是比您认为所分配的值低的一行。

如果您可以依赖输入最多有1000行,那么realloc()看起来是完全没有必要的,所以您应该考虑删除它。如果您确实需要以调用者将看到的方式重新分配,那么调用方需要传递指向其变量的指针,以便recursive_back()可以通过该指针修改它。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31151356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档