ПрограммированиеBackend C разработчик

Опишите особенности работы с операцией присваивания структур в языке C. Как копируются структуры, в чем преимущества и ограничения, какие ошибки возможны?

Проходите собеседования с ИИ помощником Hintsage

Ответ

C поддерживает прямое присваивание одной структуры другой одинакового типа: копируются все поля побайтно (memcpy). Это удобно для быстрого клонирования структуры, например:

struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Теперь p2.x=10, p2.y=20

Особенности:

  • Все поля копируются "as is" (бит в бит).
  • Если поля — указатели/массивы, копируется только сам указатель, а не содержимое по этому адресу (глубокое копирование не происходит!).
  • Присваивание работает только для структур одного типа.

Вопрос с подвохом

"Что произойдет, если структура содержит указатель на динамически выделенную память, а вы присваиваете одну структуру другой?"

Многие считают, что будет скопировано всё содержимое, но это не так.

Ответ: Скопируется только значение указателя (адрес), а не данные по этому адресу. Оба объекта структуры будут указывать на одну и ту же память.

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), программа начала вести себя непредсказуемо.