所以通过分配或使用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只是复制一块内存?那么为什么要释放影响第二个子结构的第一个子结构?
答案 0 :(得分:2)
使用memcpy
,您还复制了指向子结构的指针。如果你随后释放原始文件,你就释放了指向的内存(你刚刚复制过的文件)。
所以var_two->sub_struct
现在指向var_one->sub_struct
指向的内存。使用free(var_one->sub_struct)
,您可以有效地释放var_two->sub_struct
现在指向的内容。
顺便说一句,指向的内存var_two->sub_struct
现已丢失。