2017-02-08 54 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