2011-04-04 44 views
0

运行我的程序使用gdb SIGABORT怪异,我得到这样的:上的malloc /释放calloc调用

fem.o:malloc.c:3096:SYSMALLOC: 断言`(old_top ==(((mbinptr) (((字符*)&((AV) - >仓[((1) - 1)* 2])) - __builtin_offsetof(结构 个malloc_chunk,FD))))& & old_size == 0)|| ((无符号长)(old_size)> = (无符号长整数)((((__ builtin_offsetof (结构个malloc_chunk, fd_nextsize))+((2 *(的sizeof(为size_t))) - 1))&〜(( 2 *(的sizeof(为size_t))) - 1)))& &((old_top) - >大小为0x1 &)& & ((无符号长整数)OLD_END & pagemask)== 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的内容,它有正确数量

+0

请通过缩进4个空格来格式化您的代码(使用'{}'按钮)。在提交之前预览问题。 – kennytm 2011-04-04 15:28:27

回答

2

可能有任意数量的问题,例如:

  • n_tot价值可能是垃圾。

  • 你已经写入了一个已分配块的外部,并且这样做已经销毁了用于维护堆的数据结构。

+0

在calloc调用之前检查了n_tot,它包含正确的编号。我不想看到第二点:( – 2011-04-04 15:32:26

+0

如果你已经分配了100个字节,并且你从一开始就写入了一个150字节的位置(或者在它前面,但是那不太可能),你可能会覆盖用于其他事情的数据。 – Lindydancer 2011-04-04 15:37:24

6

断言告诉你堆内部数据结构已损坏,可能是由于你在某个点上写入了分配块的边界之外。尝试使用valgrind运行,看看它是否能告诉你你错在哪里。