我使用合并排序编写了一个简单的计数反转程序。在运行时使用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效果很好。在谷歌搜索中,我发现这是一种内存损坏问题,但没有弄清楚
void* calloc(size_t num, size_t size);
这分配块num
元素,每个元素的大小由size
给定。由于将0
传递给num
,因此要求分配一个元素为零的块。这肯定不是你想要的,因此,在某个地方,你会遇到一个错误。
我不确定你想做什么。看起来你想分配一个长度为l1+l2
的int
数组。在这种情况下,你需要写:
int *temp = calloc(l1+l2, sizeof *temp);
请注意,我假设您正在编写C,并且已经从calloc
中删除了返回值的强制转换。如果您正在编写C++,那么您一开始就不会调用calloc
。您将使用std::vector<int>
。
您的calloc
调用对我来说似乎不太合理。您正在分配零个项,每个项的大小都是sizeof(int) * (l1+l2)
字节。
话虽如此,我不确定一个断言是否真的有效。calloc
文件中写道:
void *calloc(size_t nelem, size_t elsize);
[…]
RETURN VALUE
在
nelem
和elsize
均为非零的情况下成功完成后,calloc()
应返回一个指针到分配的空间。如果nelem
或elsize
为0,则为空指针或唯一指针应返回能够成功传递给CCD_ 18的指针值。
也就是说,通过这种描述,我本以为你会得到一个指针(可能是空指针),它不适合任何东西,只适合传递给free()
。也许实际上失败的不是calloc
调用本身,而是试图对指针执行某些操作的后续代码?