C++ 为什么calloc调用可能导致内存损坏和malloc工作正常
我正在使用合并排序编写一个简单的计数反转程序。在运行时使用calloc分配内存时,我遇到以下错误:C++ 为什么calloc调用可能导致内存损坏和malloc工作正常,c++,c,memory-management,malloc,calloc,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) || ((uns
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++,那么你就不会首先调用<代码> CaloC。您将使用std::vector
您的calloc
调用对我来说似乎不太合理。您正在分配零个项目,每个项目的大小都是sizeof(int)*(l1+l2)
字节
尽管如此,我不确定一个断言是否真的有效。报告说:
[……]
RETURN VALUE
成功使用nelem
和elsize
非零完成后,calloc()
应返回指针
到分配的空间。如果nelem
或elsize
为0,则为空指针或唯一指针
应返回可成功传递给free()
的指针值
也就是说,通过这个描述,我希望您得到一个指针(可能是空指针),它不适合任何东西,只适合传递给
free()
。也许它实际上不是<代码> CALLC调用本身,它是失败的,而不是后续的试图用指针做某事的代码。工作精细,意味着你能够有效地使用<代码> TEMP有效的。在C++中,不要使用<代码> CaloC,而在C中。因为两个都分配了零字节,所以允许返回NULL
或有效指针(由实现定义)。如果你得到一个非空指针,所有对你“分配”的内存的写入都将超出范围,从而导致。很抱歉,这不是1 0将calloc(0,sizeof(int)*(l1+l2))
更改为calloc(1,sizeof(int)*(l1+l2))
极大地改变了这个问题,不是吗?为什么您要在调用中执行乘法,而不是让calloc()
为您执行乘法?不过,这是个小问题。考虑到修改后的编码,您在某个地方踩出了边界。主要区别在于calloc()
通过malloc()
将内存归零。您可能会遇到将零作为空指针并以不同方式工作的代码。是否可用于您的平台?如果是,就用它。如果没有,就获取一个VM。当您引用的手册明确说明您可以获取非空指针时,我很困惑您是否希望从calloc(0,0)
获得一个空指针。关键的一点是,您不能通过返回的指针访问任何内存,这可能是因为它是一个空指针,也可能是因为它指向分配内存的零字节。根据这种描述,我期望“一个空指针或一个唯一的指针值”。在后一种情况下,通过它进行写入很容易导致堆损坏。哎呀,我的想法是在写入之前:事实上,我的意思是,您可以得到一个空指针,或者一个可以成功传递到free
(但不要取消引用,更不要说通过它进行写入)的指针。
RETURN VALUE