【问题标题】:realloc(): invalid next size: 0x0000000002119010 [duplicate]realloc():下一个大小无效:0x0000000002119010 [重复]
【发布时间】:2012-04-25 08:31:25
【问题描述】:

当我编译和运行这段代码时,我得到一个错误。错误信息是:

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;
}

【问题讨论】:

  • realloc,不应该是(char *)realloc(content, sizeof(char) *(++mem_block_count) * BUF_LEN);吗?
  • 重新分配后,内容可能无效(因为它可能已被重新分配释放)。我认为您应该将 realloc 返回的指针分配给内容,而不是 ct_head

标签: c memory malloc realloc


【解决方案1】:

我不确定您的问题是什么,但以下几行:

    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
}

【讨论】:

  • 是的,它有效..我不会再犯这个错误了!谢谢!
【解决方案2】:

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

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

编辑

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

【讨论】:

    【解决方案3】:

    您已经在这里得到了一些很好的答案,但这里有一些不适合评论的建议。在 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 的大小与指针大小不同的平台上导致问题类型。此外,从整数类型到指针类型的转换是实现定义的。

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2012-10-31
      • 2013-09-28
      • 1970-01-01
      • 2018-06-13
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多