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 :
"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.
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.