realloc():下一个大小无效:0x0000000002119010

时间:2012-04-25 08:31:25

标签: c memory malloc realloc

当我编译并运行此代码时,出现错误。错误消息是:

realloc(): invalid next size: 0x0000000002119010

文件input大约有4000个单词。

我调试了它,但我找不到任何问题。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#define BUF_LEN 10   //buf length

int main(int argc, char *argv[])
{
  int file_d;                     //file descriptor
  char *ct_head;                  //content_first_char
  char *content;
  ssize_t read_len = BUF_LEN;     //had read length
  int mem_block_count = 0;

  file_d = open("input", O_RDONLY);

  if (file_d < 0)
    {
      perror("open");
      exit (1);
    }

  content = ct_head = (char *) malloc(sizeof(char) * BUF_LEN);
  mem_block_count = 1;

  while (read_len == BUF_LEN)
    {
      read_len = read(file_d, ct_head, BUF_LEN);
      if (read_len < 0)
        {
          perror("read");
          exit(2);
        }
      if (read_len == BUF_LEN)
        {
          ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
          ct_head = &content[(mem_block_count-1) * BUF_LEN];
        }
      else
        ct_head[read_len] = '\0';
    }
  printf("%s", content);

  close(file_d);
  free(content);
  return 0;
}

3 个答案:

答案 0 :(得分:0)

我不确定你的问题是什么,但这些内容:

    ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
    ct_head = &content[(mem_block_count-1) * BUF_LEN];

非常狡猾。在第一行之后,ct_head指向重新分配的块,content指向垃圾。然后第二行读取content并重新分配ct_head - 泄漏重新分配的内存。

我怀疑你的程序中可能只有内存损坏?

我认为

ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));

应该是:

content = (char *)realloc(content, sizeof(char) *(++mem_block_count) * BUF_LEN);
if (content == NULL)
{
    // do something if the realloc fails
}

答案 1 :(得分:0)

第一次使用realloc时,它只分配2个字节,因为进入调用时,sizeof(char)为1,mem_block_count也为1(然后预先递增为2)。

这意味着下一次读取将超出它已分配的缓冲区。我怀疑你需要在你的realloc中乘以BUF_LEN

修改

我刚刚意识到,情况更糟:在将内容分配到2个字节之后,您将ct_head设置为超出内容开头的BUF_LEN个字节。这意味着您的读取将覆盖完全位于缓冲区之外的区域。

答案 2 :(得分:0)

你已经在这里得到了一些好的答案,但这里有一些不适合评论的建议。在C中,sizeof(char) 始终 1.根据定义,它是1,因此它与使用(1 * BUF_LEN)一样多余。同样在C中,您不必[而且不应]强制转换malloc的结果。这样做可以掩盖基本错误 1

如果要根据类型的大小分配空间,请使用:

ct_head = malloc(sizeof(*ct_head) * BUF_LEN);

这样,如果ct_head的类型发生变化,您仍然会分配足够的空间,而无需将所有来电更改为mallocrealloc

<子> 1。如果您没有为malloc包含适当的标头,则C编译器将假定malloc返回int,这可能会导致int大小的平台出现问题}与指针类型的大小不同。此外,从整数类型到指针类型的转换是实现定义的。