c - 自由(): invalid next size (fast) in C

标签 c free

过去几天我一直在尝试找出程序中的这个错误。如果我增加 #defined LINE_SIZE 的大小,它在我的测试用例上工作得很好。 ,但这只是暂时解决我的问题。

在这部分代码中,我读取文件中的每一行,并为我找到的每个特定字符在内存中增加一个位置。 ascii 指向 malloc 'd 面积为 256 个整数。

void readFile(FILE *fp, int *ascii) {
   char *line;
   char *temp;

   while (!feof(fp)) {
      line = readLine(fp);
      if (line == NULL)
         break;
      temp = line;
      while (*temp  != '\0') {
         (*(ascii + *temp))++;
         temp++;
      }
      free(line);          <-------------- BREAKS HERE
   }
   fclose(fp);
}

char* readLine(FILE *fp) {
   char *rtn = NULL;
   int last = -1;
   int size = LINE_SIZE;             <------ LINE_SIZE = 8

   do {
      rtn = (char*)realloc(rtn,size);
      if (!rtn) {
         printf("Realloc failed\n");
         exit(1);
      }
      fgets(rtn + last + 1, size, fp);
      if (feof(fp))
         break;
      last = strlen(rtn) - 1;
      size += size;
      if (rtn[last] == '\n')
         break;
   } while (rtn[last] != '\0');
   return rtn;
}

我试图让我的代码读取自己的 .c 文件,但它在 250 行文件中的第 58 行处中断:void makeList(int *ascii, LinkNode *list) {

在gdb中,打印line就在我自由之前,它给了我:

(gdb) print line
$1 = 0x9849578 "void makeList(int *ascii, LinkNode *list) {\n"

这正是我期望它打印的内容。当代码尝试释放我不再需要的这一行时,代码立即崩溃。

最佳答案

您没有将正确的缓冲区大小传递给fgets()。即使您分配了那么多字节,您还是将偏移量传递到缓冲区中,并且需要考虑到这一点:

fgets(rtn + last + 1, size - last - 1, fp);

关于c - 自由(): invalid next size (fast) in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048421/

相关文章:

编译器和数据类型 => c 作为引用

为包含指针引用的已分配内存的结构释放内存的正确方法

c - 我得到了 3 个结构,我必须使用堆并将一些数据输入到结构的成员中

c - 指向返回多维数组的函数的函数指针

c - fork输出不正确

c - 使用相同的左值多次调用 strdup()

c - 释放动态分配的内存

c - 即使使用 exit(),程序读取行时也会出现 3 次内存泄漏

c - 如何重新格式化一组文件中出现的所有换行符

c - 使用 fread 从 Matlab 读取所有字符到嵌入式设备