2017-02-08 3 views
-1

Итак, было много вопросов о копировании структуры путем назначения или использования memcpy. Теперь я написал небольшую программку с наличием два структур:memcpy над структурой с другой структурой, не работающей в C

typedef struct { 

int b; 
} myStruct2; 

typedef struct { 

int a; 
myStruct2* sub_struct; 
} myStruct; 

Так что теперь я попытался определить две структуру, а затем использовать тетср над ними, как это (я обработкой 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 дает мне ошибку:
Invalid чтения размера 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.

Btw, память var_two->sub_struct указывает на то, что он потерян.

+0

ОК, спасибо вам большое! поэтому я в этих случаях вручную скопировал подструктуры правильно? – malajedala

Смежные вопросы