【问题标题】:weird SIGABORT on malloc/calloc callmalloc/calloc 调用上的奇怪 SIGABORT
【发布时间】:2011-07-29 06:43:55
【问题描述】:

用 gdb 运行我的程序我得到了这个:

fem.o: malloc.c:3096: sysmalloc: 断言`(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (无符号长)((((__builtin_offsetof (结构 malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & 页面掩码) == 0)' 失败。

节目收到信号SIGABRT, 中止。 0xb7fe1424 在 __kernel_vsyscall()

我发现这个错误出现在这段代码之后:

problem->y0 = (double *)calloc(n_tot, sizeof(double));

问题是一个有双 *y0 作为成员的结构。

之前在函数中,我是这样做的

problem = (fem_problem *)calloc(1, sizeof(fem_problem));

我也没有收到任何错误问题 == NULL。

有什么建议吗?

添加:

我已经检查了 n_tot 的内容,它的编号是正确的

【问题讨论】:

  • 请通过缩进 4 个空格来格式化您的代码(使用 {} 按钮)。提交前预览问题。

标签: c dynamic-allocation


【解决方案1】:

断言告诉您堆内部数据结构已损坏,可能是由于您在某个时间点超出了已分配块的范围。尝试使用valgrind 运行,看看它是否能告诉你哪里出错了。

【讨论】:

    【解决方案2】:

    可能有很多问题,例如:

    • n_tot 的值可能是垃圾。

    • 您在分配的块之外进行了写入,并且这样做会破坏用于维护堆的数据结构。

    【讨论】:

    • 在 calloc 调用之前检查了 n_tot,它包含正确的数字。我不明白第二点:(
    • 如果您分配了 100 个字节,并且您写入的位置距开头 150 个字节(或在其前面,但可能性较小)您可能覆盖了以下数据用于其他用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2018-06-26
    • 2015-06-05
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多