这是我的代码。我以为我会在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
还是会有内存泄漏?
答案 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
)相同。对于计算机,b1
和b2
只是两个具有相同位模式的不同位置。