ProgrammatieBackend C ontwikkelaar

Beschrijf de kenmerken van het werken met de toewijzingsoperatie van structuren in de programmeertaal C. Hoe worden structuren gekopieerd, wat zijn de voordelen en beperkingen, en welke fouten kunnen optreden?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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:

  • Alle velden worden "as is" gekopieerd (bit voor bit).
  • Als de velden pointers/arrays zijn, wordt alleen de pointer zelf gekopieerd, niet de inhoud op dit adres (diepe kopie gebeurt niet!).
  • Toewijzing werkt alleen voor structuren van hetzelfde type.

Vraag met een haakje

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

Voorbeelden van werkelijke fouten vanwege onwetendheid over de nuances van het onderwerp


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.