free():C中的下一个大小(快)无效

时间:2012-01-28 20:39:59

标签: c free

在我的程序中,过去几天一直想弄清楚这个bug。如果我增加#defined LINE_SIZE的大小,它在我的测试用例上运行正常,但这只是我问题的临时修复。

在这部分代码中,我读取文件中的每一行,并为我找到的每个特定字符增加内存中的一个点。 ascii指向256个int的malloc'd区域。

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"

这正是我期望它打印的内容。当代码试图释放我不再需要的这条线时,代码就会崩溃。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

ascii指向256 * 4 = 1024字节的区域,并且您将要读取的行复制到其中;因此,除非您的行(平均)长约20个字符,否则您将在到达第58行之前运行该缓冲区的末尾。可能不会导致自由失败,但它无法帮助。 / p>

相关问题