【问题标题】:Filling of a structure using memcpy使用 memcpy 填充结构
【发布时间】:2017-07-06 09:28:18
【问题描述】:

这是我的代码。我以为我会在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 还是这里会有一些内存泄漏?

【问题讨论】:

标签: c struct memcpy


【解决方案1】:

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的内容完全相同,所以b2->x.pointer1指向完全相同与b1->x.pointer1 的位置相同,因此一旦free(b1->x.pointer1); 完成,就不能再完成free(b2->x.pointer1);。释放两次相同的内存会导致未定义的行为(很可能是崩溃)。

【讨论】:

    【解决方案2】:

    除了 Michael Walz 的回答...

    谁能给我一些解释?

    memcpy 逐位复制指定的字节数。这就是你不进行段错误的原因。如果你往下看内存,你会发现b2中的bits已经和b1一模一样了。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 2021-03-01
      • 2014-07-01
      • 1970-01-01
      • 2011-08-13
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多