C ondersteunt directe toewijzing van de ene structuur naar de andere van hetzelfde type: alle velden worden byte-voor-byte gekopieerd (memcpy). Dit is handig voor snelle kloning van een structuur, bijvoorbeeld:
struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Nu is p2.x=10, p2.y=20
Kenmerken:
"Wat gebeurt er als de structuur een pointer naar dynamisch toegewezen geheugen bevat, en je wijst de ene structuur aan de andere toe?"
Veel mensen denken dat de hele inhoud wordt gekopieerd, maar dat is niet het geval.
Antwoord: Er wordt alleen de waarde van de pointer (adres) gekopieerd, niet de gegevens op dit adres. Beide structuurobjecten wijzen naar hetzelfde geheugen.
struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr
Door d2.arr te wijzigen, wijzig je het geheugen dat d1.arr ziet.
Verhaal 1
Serialisatie van gegevens: we wijzen een structuur met een interne buffer-pointer (malloc) toe — na de kopie wezen twee verschillende objecten naar hetzelfde geheugen, en bij het vrijgeven werden beide free() aangeroepen. Resultaat — dubbele vrijgave en crash van de service.
Verhaal 2
In een poging een complexe structuur te klonen, vergat ik een diepe kopie van de pointer-velden te maken. Na het wijzigen van de kopie verwachtten we onafhankelijkheid, maar we wijzigden het origineel (en vice versa), waardoor de gegevens inconsistent raakten.
Verhaal 3
We hebben een structuur met een geneste pointer naar een string. We wijzen een structuur toe, waarna we een van de strings vrijgaven, en de andere structuur "breekt" plotseling (dangling pointer), waardoor het programma zich onvoorspelbaar begint te gedragen.