gpt4 book ai didi

c - memcpy 覆盖一个结构,而另一个结构在 C 中不起作用

转载 作者:行者123 更新时间:2023-11-30 18:49:42 24 4
gpt4 key购买 nike

因此,关于通过分配或使用 memcpy 复制结构已经存在很多问题。现在我编写了一个具有两个结构的小程序:

typedef struct {

int b;
} myStruct2;

typedef struct {

int a;
myStruct2* sub_struct;
} myStruct;

所以现在我尝试定义两个结构,然后像这样对它们使用 memcpy (我在分配内存后处理 NULL 指针,只是将其保留以方便阅读):

myStruct* var_one = malloc(sizeof(myStruct));
var_one->sub_struct = malloc(sizeof(myStruct2));

var_one->a = 10;
var_one->sub_struct->b = 111;

myStruct* var_two = malloc(sizeof(myStruct));
var_two->sub_struct = malloc(sizeof(myStruct2));

var_two->a = 22;
var_two->sub_struct->b = 2222;

printf("%d und %d\n", var_two->a, var_two->sub_struct->b);


memcpy(var_two, var_one, sizeof(myStruct));


printf("%d und %d\n", var_two->a, var_two->sub_struct->b);

到目前为止,一切正常且符合预期。但知道我是否这样做:

free(var_one->sub_struct);
free(var_one);

printf("%d und %d\n", var_two->a, var_two->sub_struct->b);

第二个 printf 给了我错误:
大小 4 的读取无效;

有人可以解释一下为什么吗? var_two子结构的内存已经单独分配了,我以为memcpy只是复制了一 block 内存?那么为什么释放第一个子结构会影响第二个子结构呢?

最佳答案

通过您的memcpy,您还复制了指向子结构的指针。如果您随后释放原始内存,您就释放了指向的内存(您刚刚复制的内存)。

因此,var_two->sub_struct 现在指向 var_one->sub_struct 指向的内存。使用free(var_one->sub_struct),您已经有效地释放了var_two->sub_struct现在所指向的内容。

顺便说一句,var_two->sub_struct 指向的内存现在丢失了。

关于c - memcpy 覆盖一个结构,而另一个结构在 C 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42118298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com