我尝试使用memcpy将内容从一个数组复制到另一个数组,代码如下:
#include <stdio.h>
int main(){
int *a;
a = (int*) malloc(sizeof(int) * 4);
a[0] = 4;
a[1] = 3;
a[2] = 2;
a[3] = 1;
int *b;
b = (int*) malloc(sizeof(int) * 4);
memcpy(&b, &a, sizeof(a));
free(a);
for (int i = 0; i < 4; i++){
printf("b[%d]:%d",i,b[i]);
}
printf("%d\n",sizeof(b));
free(b);
return 0;
}
但是,当我尝试运行它时,遇到以下错误:
b[0]:4b[1]:3b[2]:2b[3]:18
mem(6131,0x7fffbb4723c0) malloc: *** error for object 0x7fa5a4c02890: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
如果删除free(b)
代码,此错误就会消失,但是,我不知道为什么,因为我明确地将资源分配给它。
答案 0 :(得分:8)
您的memcpy
错了。您正在将指针a
的值复制到b
,而不是将a
指向的数据复制到b
指向的缓冲区中。由于a
和b
指向同一个地方,因此您最终执行双重免费操作。将memcpy
来电替换为:
memcpy(b, a, sizeof(int)*4);
答案 1 :(得分:5)
memcpy(&b, &a, sizeof(a));
这不会将a
指向的4个整数复制到b
指向的4个整数。
而是使用b
的内容覆盖a
。然后你最终做了一个双重免费,因为a
和b
都包含相同的地址。
我将重复我对你的问题的评论:你需要花时间去理解指针和指针之间的区别。什么保留和解决,以及该地址是什么。
答案 2 :(得分:3)
这就是为什么我们说 not to cast the return value of malloc()
and family in C
.。
首先,您缺少stdlib.h
包含,因此,malloc()
的原型未知且您的编译器 assumnes 它返回{{1 }}。这会在隐式声明和实际定义之间产生不匹配,后者在稍后阶段会调用undefined behavior。
那就是说,另一个主要问题是你写int
这是非常错误的。您希望自己提供memcpy(&b, &a, sizeof(a));
和a
,因为您希望将b
指向的内存位置的内容复制到a
指向的内存位置,而不是地址的指针。
在您的情况下,错误的调用实际上弄乱 b
的内容,即b
返回的实际指针。因此,正如我们所知,将一个未被内存分配器函数或malloc()
- d确切返回的指针传递给free()
会导致UB引用free()
,章节§7.22.3.3,
[...]否则,如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果通过调用
C11
或free
释放了空格,则 行为未定义。
你遇到了麻烦,因为realloc
所持有的当前指针与已经传递给b
的{{1}}相同。如其他答案 [1] [2] 所述,您需要写
a
故事的道德: 启用编译器警告并始终检查数据类型。
答案 3 :(得分:0)
也许是因为当你自由时你获得了自由b(a)。因为memcpy后内存区域是相同的。最后尝试免费(b),没有免费(a)。