memcpy在一个结构上,另一个结构在C中不起作用

时间:2017-02-08 16:17:39

标签: c

所以通过分配或使用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);

Sofar一切正常并且符合预期。但是知道我是否这样做:

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只是复制一块内存?那么为什么要释放影响第二个子结构的第一个子结构?

1 个答案:

答案 0 :(得分:2)

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

所以var_two->sub_struct现在指向var_one->sub_struct指向的内存。使用free(var_one->sub_struct),您可以有效地释放var_two->sub_struct现在指向的内容。

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