2017-02-08 52 views
-1

所以已经有很多关于通过分配或使用memcpy复制结构的问题。现在,我写了一个小PROGRAMM具有两种结构:memcpy结构与另一个结构不工作在C

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

+0

'memcpy'不会执行深层复制。如果您不会遵循指针并复制对象,请编写自定义函数。 – StoryTeller

回答

2

与您的memcpy你也复制指针到子结构。如果您随后释放原始内容,则释放了指向的内存(您刚刚复制过)。

所以var_two->sub_struct现在指向var_one->sub_struct指向的内存。用free(var_one->sub_struct)你已经有效地释放了现在指向的var_two->sub_struct

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

+0

好的非常感谢你!所以我在这些情况下手动复制子结构? – malajedala