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



我使用合并排序编写了一个简单的计数反转程序。在运行时使用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+l2int数组。在这种情况下,你需要写:

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

nelemelsize均为非零的情况下成功完成后,calloc()应返回一个指针到分配的空间。如果nelemelsize为0,则为空指针或唯一指针应返回能够成功传递给CCD_ 18的指针值。

也就是说,通过这种描述,我本以为你会得到一个指针(可能是空指针),它不适合任何东西,只适合传递给free()。也许实际上失败的不是calloc调用本身,而是试图对指针执行某些操作的后续代码?

相关内容

  • 没有找到相关文章

最新更新