Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么calloc调用可能导致内存损坏和malloc工作正常_C++_C_Memory Management_Malloc_Calloc - Fatal编程技术网

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

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

我正在使用合并排序编写一个简单的计数反转程序。在运行时使用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++,那么你就不会首先调用<代码> 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