Если вы просто копируете структуру, вы перезаписываете указатель, а не то, на что он указывает. Что вы, вероятно, захотите сделать вместо memcpy:
size_t bytes = strlen(p1.name)+1;
p2.name = realloc(p2.name, bytes);
if (p2.name != NULL) {
memcpy(p2.name, p1.name, bytes);
}
Здесь bytes
- это количество символов в имени плюс строка nul-terminator, и вызов realloc
изменяется размер p2.name, чтобы соответствовать этому. Теперь, гарантируя, что места достаточно, вы можете memcpy
ввести первое имя во второе.
Использование reallo c здесь, вероятно, неэффективно, поскольку оно сохраняет исходное содержимое p2.name, которое мы надеваем не нужно В качестве альтернативы можно было бы сначала освободить старую строку, прежде чем выделять место для новой:
size_t bytes = strlen(p1.name)+1;
free(p2.name);
p2.name = malloc(bytes);
if (p2.name != NULL) {
memcpy(p2.name, p1.name, bytes);
}
Помните, что оба mallo c и reallo c могут потерпеть неудачу и вернут NULL, если ваша программа не хватает памяти, поэтому рекомендуется всегда проверять это.