使用memcpy时“未分配指针”

时间:2017-03-07 16:43:00

标签: c pointers malloc

我尝试使用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)代码,此错误就会消失,但是,我不知道为什么,因为我明确地将资源分配给它。

4 个答案:

答案 0 :(得分:8)

您的memcpy错了。您正在将指针a的值复制到b,而不是将a指向的数据复制到b指向的缓冲区中。由于ab指向同一个地方,因此您最终执行双重免费操作。将memcpy来电替换为:

memcpy(b, a, sizeof(int)*4);

答案 1 :(得分:5)

memcpy(&b, &a, sizeof(a));

这不会将a指向的4个整数复制到b指向的4个整数。

而是使用b的内容覆盖a。然后你最终做了一个双重免费,因为ab都包含相同的地址。

我将重复我对你的问题的评论:你需要花时间去理解指针和指针之间的区别。什么保留和解决,以及该地址是什么。

答案 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,

  

[...]否则,如果   该参数与先前由内存管理返回的指针不匹配   函数,或者如果通过调用C11free释放了空格,则   行为未定义。

你遇到了麻烦,因为realloc所持有的当前指针与已经传递给b的{​​{1}}相同。如其他答案 [1] [2] 所述,您需要写

a

故事的道德: 启用编译器警告并始终检查数据类型。

答案 3 :(得分:0)

也许是因为当你自由时你获得了自由b(a)。因为memcpy后内存区域是相同的。最后尝试免费(b),没有免费(a)。