使用memcpy填充结构

时间:2017-07-06 09:28:19

标签: c struct memcpy

这是我的代码。我以为我会在b2->x.pointer1->data上获得SegFault,因为我没有malloc b2->x.pointer1。有人可以给我一些解释吗?在执行memcpy时,将哪些值复制到b2->x.pointer1?关于struct *b2特别是由memcpy填写的簿记,它是如何记录其成员的?我的所有动机都是知道b2->x.pointer1如何在堆上记忆。

struct A
{
    int data;
};


struct B
{
    int data;
    union X
    {
        struct A *pointer1;
        //another
    }x;
};


int main(int argc, char **argv)
{

    struct B *b1 = (struct B*) malloc(sizeof(struct B));
    b1->data = 100;
    b1->x.pointer1 = (struct A*) malloc(sizeof(struct A));
    b1->x.pointer1->data = 1;

    struct B *b2 = (struct B*) malloc(sizeof(struct B));
    //b2->x.pointer1 = (struct A*) malloc(sizeof(struct A));

    memcpy(b2, b1, sizeof(struct B));

    printf("%d", b2->x.pointer1->data);

    return 0;
}

如果我free(b1)怎么办?它会释放b1->x.pointer1还是会有内存泄漏?

2 个答案:

答案 0 :(得分:3)

free函数对所释放内存的内容一无所知。

换句话说,free(b1)只会将内存b1释放,导致内存泄漏,因为b1->x.pointer1尚未释放且无法再访问。

在释放b1->x.pointer1之前,您需要明确地释放b1

正确的释放顺序:

free(b1->x.pointer1);
free(b1);
free(b2);

经验法则是:malloc分配的所有内容都需要明确地用free释放。

关于b2:在memcpy之后,*b2的内容*b1的内容完全相同,因此{{ 1}}指向b2->x.pointer1完全相同的位置,因此b1->x.pointer1完成free(b2->x.pointer1);后不得执行free(b1->x.pointer1);。释放两次相同的内存会导致未定义的行为(很可能是崩溃)。

答案 1 :(得分:1)

除了Michael Walz的回答......

  

有人可以给我一些解释吗?

memcpy执行指定字节数的逐位复制。这就是为什么你没有段错误。如果你往下看内存,你会发现b2中的位与b1完全相同。

  

在执行memcpy时,将哪些值复制到b2-> x.pointer1?

复制的数据与您复制的源(本例中为b1)相同。对于计算机,b1b2只是两个具有相同位模式的不同位置。