Итак, было много вопросов о копировании структуры путем назначения или использования 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 просто копирует кусок памяти? Итак, почему освобождение первой подструктуры влияет на вторую?
'memcpy' не создает глубокую копию. Если вы не будете следовать указателям и копировать объекты, напишите пользовательскую функцию. – StoryTeller