ProgrammatieC ontwikkelaar

Leg het verschil uit tussen stapel en heap in de C-taal en wanneer je het beste het ene of het andere type geheugen kunt gebruiken?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In de C-taal kan het geheugen voor variabelen worden toegewezen op de stapel (stack) of in de heap (heap).

  • Stapel — wijst automatisch geheugen toe bij het binnenkomen van een functie en geeft het vrij bij het verlaten ervan. Snel, maar de hoeveelheid geheugen is beperkt door de grootte van de stapel (meestal enkele MB).
  • Heap — wijst geheugen dynamisch toe via malloc, calloc, realloc, en moet handmatig worden vrijgegeven via free. De hoeveelheid geheugen is beperkt door de mogelijkheden van het systeem, maar de toegang is langzamer en het vrijgeven wordt handmatig gecontroleerd.

Wanneer de stapel gebruiken:

  • Voor lokale variabelen, als hun grootte klein is en op het compilertijd bekend is.
  • Voor functieargumenten en kleine arrays.

Wanneer de heap gebruiken:

  • Wanneer de grootte van het geheugen vooraf niet bekend is.
  • Voor grote of langdurige objecten.

Voorbeeldcode:

// Op de stapel int arr[10]; // In de heap int* parr = malloc(sizeof(int) * 10); // Vergeet niet het geheugen vrij te geven free(parr);

Vraag met een valstrik.

Vraag: Wat gebeurt er als je geen free-functie aanroept voor een array die is toegewezen via malloc?

Verlop: Er zal een geheugenlek optreden (memory leak). Dynamisch toegewezen geheugen wordt niet automatisch vrijgegeven, en na verloop van tijd kan dit leiden tot een geheugenuitputting van de applicatie of het volledige systeem.

Voorbeeldcode:

void leak() { int* leakArr = malloc(100 * sizeof(int)); // Geen aanroep van free(leakArr), geheugen gaat verloren }

Verhaal

In één project wees programmeurs geheugen toe voor een structuur die een gebruikerssessie beschrijft via malloc, maar vergaten free aan te roepen aan het einde van het werk met de sessie. Als gevolg verloor het project gedurende enkele dagen geheugen en viel de server met een geheugenstekort-fout. Het probleem werd pas opgelost na profilering met Valgrind en het corrigeren van alle gemiste free-aanroepen.


Verhaal

Een ontwikkelaar wees een grote array (tot 10 MB) op de stapel toe voor tijdelijke berekeningen. Op een server met een kleine stapelgrootte leidde dit tot een crash van de applicatie met een stack overflow-fout. Na een analyse moest de buffer naar de heap worden verplaatst.


Verhaal

Een van de ontwikkelaars besloot lange strings op de stapel op te slaan, maar de grootte van de string werd subjectief door de gebruiker vastgesteld. Bij invoer van een zeer lange string viel de applicatie met een geheugenbedrijfsfout. Uiteindelijk werd besloten om de ingevoerde gegevens naar de heap te verplaatsen met een lengtecontrole.