ProgrammationDéveloppeur Backend C

Décrivez les particularités du travail avec l'opération d'assignation de structures en langage C. Comment les structures sont-elles copiées, quels sont les avantages et les limitations, quelles erreurs sont possibles ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

C prend en charge l'assignation directe d'une structure à une autre de même type : tous les champs sont copiés octet par octet (memcpy). Cela est pratique pour le clonage rapide d'une structure, par exemple :

struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Maintenant p2.x=10, p2.y=20

Particularités :

  • Tous les champs sont copiés "as is" (bit à bit).
  • Si les champs sont des pointeurs/des tableaux, seul le pointeur lui-même est copié, et non le contenu à cette adresse (la copie profonde ne se produit pas !).
  • L'assignation ne fonctionne que pour des structures du même type.

Question piège

"Que se passe-t-il si la structure contient un pointeur vers une mémoire allouée dynamiquement, et que vous assignez une structure à une autre ?"

Beaucoup pensent que tout le contenu sera copié, mais ce n'est pas le cas.

Réponse : Seule la valeur du pointeur (l'adresse) sera copiée, et non les données à cette adresse. Les deux objets de la structure pointeront vers la même mémoire.

struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr

En modifiant d2.arr, vous modifiez la mémoire que voit d1.arr.

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire 1

Sérialisation des données : nous avons assigné une structure avec un tampon interne pointeur (malloc) - après la copie, deux objets différents pointaient vers la même mémoire, et lors de la libération, les deux appelaient free(). Résultat - double free et plantage du service.


Histoire 2

Dans une tentative de cloner une structure complexe, j'ai oublié de faire une copie profonde des champs pointeurs. Après avoir modifié la copie, nous avons attendu l'indépendance, mais nous avons modifié l'original (et vice versa), perdant la cohérence des données.


Histoire 3

Nous avons stocké une structure avec un pointeur imbriqué vers une chaîne. Nous avons assigné la structure, après quoi nous avons libéré l'une des chaînes, et l'autre structure a soudainement "cassé" (dangling pointer), le programme a commencé à se comporter de manière imprévisible.