为什么calloc调用可能导致内存损坏,malloc工作正常

时间:2014-10-21 13:07:43

标签: c++ c memory-management malloc calloc

我正在使用合并排序编写一个简单的计数反转程序。在使用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工作正常。在谷歌上搜索我发现它是一种内存损坏问题,但没有明确说明

2 个答案:

答案 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
     

成功完成nelemelsize非零后,calloc()将返回指针       到分配的空间。如果nelemelsize为0,则为空指针或唯一       

将返回可成功传递给free()的指针值

即。根据这个描述,我预计你会得到一个指针(可能是一个空指针),它不适合传递给free()的任何东西。也许它实际上不是calloc调用本身失败而是后续代码试图用指针做某事?