Вот упрощение проблемы, как в вашем коде:
struct organ a, b;
a.name = malloc(6);
strcpy(a.name, "hello");
b = a;
free(a.name);
puts(b.name);
Ваш код использует memcpy
, но memcpy(&b, &a, sizeof b);
практически такой же, как b = a;
, поэтому я использовал более простой синтаксисв моем примере.
Проблема в том, что есть только один вызов malloc
.И a.name
, и b.name
указывают на один и тот же блок памяти.Вы освобождаете этот блок и затем пытаетесь вывести его содержимое.
Возможно, вы хотите, чтобы b.name
имел собственный блок памяти.Это означает, что вам нужно снова вызвать malloc
, оператор =
(или функция memcpy
) не вызывает malloc.
Например, в моем коде измените строку b = a;
на:
b.name = malloc( strlen(a.name) + 1 );
strcpy(b.name, a.name);
Другими словами, процедура для так называемого "глубокого копирования" struct organ
не совпадает с процедурой, выполняемой оператором присваивания.
Я бы порекомендовал вам сделать функцию для выполнения копии struct organ
, которая ведет себя так, как вы хотите;и вызовите эту функцию вместо использования оператора присваивания или memcpy
.
Вы также можете сделать то же самое для копирования struct human
.