C поддерживает прямое присваивание одной структуры другой одинакового типа: копируются все поля побайтно (memcpy). Это удобно для быстрого клонирования структуры, например:
struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Теперь p2.x=10, p2.y=20
Особенности:
"Что произойдет, если структура содержит указатель на динамически выделенную память, а вы присваиваете одну структуру другой?"
Многие считают, что будет скопировано всё содержимое, но это не так.
Ответ: Скопируется только значение указателя (адрес), а не данные по этому адресу. Оба объекта структуры будут указывать на одну и ту же память.
struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr
Изменяя d2.arr, вы изменяете память, которую видит d1.arr.
История 1
Сериализация данных: присваивали структуру с внутренним буфером-указателем (malloc) — после копирования два разных объекта указывали на одну память, и при освобождении оба вызывали free(). Итог — double free и крах сервиса.
История 2
В попытке клонировать сложную структуру забыл сделать глубокую копию полей-указателей. После изменения копии ожидали независимость, но меняли оригинал (и наоборот), теряя консистентность данных.
История 3
Хранили структуру с вложенным указателем на строку. Присваивали структуру, после чего освобождали одну из строк, а вторая структура внезапно "сломалась" (dangling pointer), программа начала вести себя непредсказуемо.