2017-02-08 7 views
-1

したがって、memcpyを割り当てることによって構造体をコピーすることにはすでに多くの疑問があります。今、私は2つの構造を持つ小型のprogrammを書いた:memcpyはCで動作しない別の構造を持つ構造体上にある

typedef struct { 

int b; 
} myStruct2; 

typedef struct { 

int a; 
myStruct2* sub_struct; 
} myStruct; 

は、だから今、私はちょうどのためにそれを残し、私はメモリを割り当てた後、NULLポインタを処理しています(二つの構造を定義し、このようにそれらの上にのmemcpyを使用しようとしました読みやすい):

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がメモリの一部をコピーしていると思いますか?なぜ、最初のサブ構造を解放して2番目のサブ構造に影響を与えるのですか?

+0

'memcpy'はディープコピーを実行しません。ポインターやコピーオブジェクトに従わない場合は、カスタム関数を記述します。 – StoryTeller

答えて

2

memcpyでは、ポインタもサブ構造体にコピーされました。その後、オリジナルを解放すると、(コピーしたばかりの)メモリを解放したことになります。

したがってvar_two->sub_structは、var_one->sub_structが指すメモリを指すようになりました。 free(var_one->sub_struct)を使用すると、var_two->sub_structが現在指しているものを効果的に解放することができます。

Btwの場合、メモリvar_two->sub_structが指摘されました。

+0

okありがとうございました!私はこれらの場合手動で部分構造を正しくコピーすることができますか? – malajedala

関連する問題