【问题标题】:malloc() error after initializing a dynamically allocated array初始化动态分配的数组后出现 malloc() 错误
【发布时间】:2015-07-04 02:27:33
【问题描述】:

我试图在初始化另一个动态分配的数组后再次调用malloc,但我的程序无法运行(尽管它可以通过编译)。我的部分代码如下。

table = (Node **)malloc(m * sizeof(Node*));

for(i=0; i<=m; i++)
  table[i] = NULL;

table2 = (Node *)malloc(n * sizeof(Node));

错误信息如下:

malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)
->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_si
ze == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (st
ruct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t
))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' 
failed.

最奇怪的是,我发现我的程序在删除上面代码中的第二行和第三行后可以成功运行,其中NULL被分配给table[i]。我有点困惑,因为我不知道是什么导致了这个malloc 错误。另外,将NULL分配给新分配的指针是否合适?

谢谢!

【问题讨论】:

  • malloc返回的指针是否有效?显示所有相关代码。断言的哪一部分实际上失败了?
  • i&lt;=m 将在 i == m 时访问未分配的内存。
  • 如果那是 C 代码:不要像 malloc 返回的那样转换 void *!删除 C++ 标记,这些是不同的语言,您也不会因为它们的某些语法相同而添加 Java。
  • 我从未听说过“C/C++”这门语言是新的吗?
  • 不客气。 valgrind 会告诉你的。

标签: c pointers malloc dynamic-allocation


【解决方案1】:

for 循环中的i&lt;=m 不会超出您在第一个malloc() 调用中分配的区域吗?您在表中分配了m 节点指针,然后将m+1 条目设置为等于NULL

【讨论】:

  • 它是我们的好“朋友”未定义的行为
  • 但错误似乎出现在malloc 本身。好的,“在 UB 之后不要指望任何事情”
  • 你在跟我说话吗?我不是OP!
  • @MarkZ:不用跟我解释了。我已经注意到了。您仍然应该使您的代码成形;我评论不是为了好玩!对于消息,我同意。那是相当野兽的表情。抱歉,我花了一些时间才意识到这不是来自您的代码。
  • 只是强调,一旦您离开该数组的末尾并损坏内存,您就不能真正依赖行为或错误消息。很可能您破坏了 malloc 正在使用/依赖的东西。一些分配将用户数据和(内部分配)列表数据放在一起。
【解决方案2】:
for(i=0; i<=m; i++)
  table[i] = NULL;

第二个表达式需要改为i &lt; m。您已分配 m 插槽。访问范围为0...(m-1)

table,大小 = 3

+---+---+---+
| 0 | 1 | 2 |
+---+---+---+

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2017-08-01
    • 1970-01-01
    • 2020-05-04
    • 2016-04-23
    相关资源
    最近更新 更多