【问题标题】:realloc(): invalid next size - realloc dynamic structrealloc():下一个大小无效 - realloc 动态结构
【发布时间】:2016-03-19 04:22:54
【问题描述】:

我开始学习C中的struct。今天我发现了一个我无法解决的问题。我有这个代码:

typedef struct fraze
{
  char *mostSearch = NULL; // for string from user
  double freq;
} s_FRAZE;

int readFraze( )
{
  int i = 2, k;
  size_t len = 0;
  char c;
  s_FRAZE *s;
  s = (s_FRAZE *)malloc( i * sizeof( int ));
  k = 0;
  while( (c = getchar()) != '\n')
  {
    ungetc( c, stdin );

    if( scanf( "%lf%c", &s[k].freq, &c) != 2 || c != ':' )
    {
      return 1;
    }

    if( k + 1 >= i )
    {
      i *= 2;
      printf("%d\n", i );
      s = (s_FRAZE *)realloc( s, i * sizeof( int ));
    }

    len = getline(&s[k].mostSearch, &len, stdin );
    s[k].mostSearch[len-1] = '\0';
    k++;
  }

  return 0;
}

我想在用户不输入“\n”时阅读,但它可以工作 2 倍,然后我得到这个错误 realloc(): invalid next size: 0x0000000001559010 *** 我尝试使用 valgrind 并且有更多错误:

==7662== 大小为 8 的无效写入
==7662== 在 0x56AEBB4:_IO_vfscanf (vfscanf.c:2328)
==7662== by 0x56BBD3A: scanf (scanf.c:33)
==7662== by 0x40089F: readFraze() (main.c:31)
==7662== by 0x400818: main (main.c:15)
==7662== 地址 0x59fe048 是在一个大小为 8 的块分配后的 0 个字节
==7662== 在 0x4C27C0F:malloc (vg_replace_malloc.c:299)
==7662== by 0x400847: readFraze() (main.c:25)
==7662== by 0x400818: main (main.c:15)
==7662==
==7662== 条件跳转或移动取决于未初始化的值
==7662== 在 0x56BFCA2:getdelim (iogetdelim.c:63)
==7662== by 0x40093E: readFraze() (main.c:44)
==7662== by 0x400818: main (main.c:15)

谁能告诉我,我做错了什么?

【问题讨论】:

  • 不要将malloc 和朋友的结果投射到 C 中。
  • malloc( i * sizeof( int )); --> malloc( i * sizeof( s_FRAZE )); 假设你想要数组中的i 元素。
  • realloc( s, i * sizeof( int )); 相同 --> realloc( s, i * sizeof( s_FRAZE ));
  • 在调用malloc() 和函数族时,始终检查 (!=NULL) 返回值以确保操作成功
  • 编译时,始终启用所有警告,然后修复这些警告。 (对于 gcc,至少使用:-Wall -Wextra -pedantic)发布的代码不仅会引发大量警告,还会引发一些错误。 IE。在修复所有错误之前,发布的代码将永远不会运行。我看到的唯一可能性是这不是您的真实代码。请贴出真实代码

标签: c struct realloc


【解决方案1】:

当您看到涉及mallocreallocfree 的回溯时,这意味着您的堆已损坏:您的程序覆盖了内存管理系统使用的一些数据结构。最常见的原因是写入超出了malloc 分配的块的边界(缓冲区溢出),并在调用malloc 后继续使用malloc 分配的内存块(在空闲后使用)。

正如Weather Vane 已经在评论中提到的那样,您传递给mallocreallocs 的大小与您对s 的使用不匹配。 s 是一个指向struct fraze 数组的指针,并且您使用该数组中最多k 的元素,因此内存块必须足够大以容纳k+1 类型为struct fraze 的元素。鉴于您的分配策略,这意味着您必须为 struct fraze 类型的 i 元素留出空间。但是您的实际分配仅用于sizeof( int ) 字节,这还不够。

做到这一点

s = malloc(i * sizeof(*s));

和(带错误检查)

s_FRAZE *new_s = realloc(s, i * sizeof(*s));
if (new_s == NULL) {
    fputs("Out of memory!\n", stderr);
    exit(2);
}
s = new_s;

一般来说,您将指针s 分配给的i 元素数组的大小是i * sizeof(*s)。不要使用 sizeof( 类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2014-10-13
    • 2015-01-22
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多