我正在使用合并排序编写一个简单的计数反转程序。在使用calloc在运行时分配内存时,我收到以下错误:
a.out: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct 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.
Aborted (core dumped)
使用此代码:
int *temp = (int*)calloc(1, sizeof(int) * (l1+l2)) ;
虽然使用malloc而不是calloc工作正常。在谷歌上搜索我发现它是一种内存损坏问题,但没有明确说明
答案 0 :(得分:3)
void* calloc(size_t num, size_t size);
这会分配一个块num
元素,每个元素的大小由size
给出。由于您为0
传递了num
,因此您要求分配一个零元素的块。这肯定不是你想要的,因此,在某个地方,你会遇到错误。
我不确定你要做什么。您似乎正在尝试分配长度为int
的{{1}}数组。在这种情况下,你需要写:
l1+l2
请注意,我假设您正在编写C,并已从int *temp = calloc(l1+l2, sizeof *temp);
中删除了返回值的强制转换。如果您正在编写C ++,那么您首先不会调用calloc
。您正在使用calloc
。
答案 1 :(得分:1)
您的calloc
调用对我来说似乎不太合理。您正在分配零项,每个项的大小为sizeof(int) * (l1+l2)
个字节。
话虽如此,我不确定断言是否真的有效。 calloc
documentation说:
void *calloc(size_t nelem, size_t elsize);
[...]
RETURN VALUE
成功完成
将返回可成功传递给nelem
和elsize
非零后,calloc()
将返回指针 到分配的空间。如果nelem
或elsize
为0,则为空指针或唯一free()
的指针值
即。根据这个描述,我预计你会得到一个指针(可能是一个空指针),它不适合传递给free()
的任何东西。也许它实际上不是calloc
调用本身失败而是后续代码试图用指针做某事?