Geschiedenis van de vraag:
Stack-geheugen is aanwezig in alle belangrijke architecturen. In de C-taal worden automatische (lokale) variabelen op de stack geplaatst, wat een hoge snelheid van geheugenallocatie en -vrijgave biedt in vergelijking met dynamische heap.
Probleem:
Het gebruik van de stack is beperkt in grootte, automatische variabelen worden automatisch vernietigd na het verlaten van een blok, en een stap buiten de stack (stack overflow) leidt tot een crash van het programma of gegevensbeschadiging.
Oplossing:
Lokale variabelen die binnen functies zijn gedeclareerd zonder een speciale modifikator, worden op de stack geplaatst. Dit gebied van automatische opslag wordt aangemaakt bij binnenkomst in de functie en wordt vernietigd bij het verlaten ervan. De grootte van de stack is beperkt en kan alleen worden gewijzigd via link- of systeemopties.
Voorbeeldcode:
#include <stdio.h> void foo() { int arr[100]; // geplaatst op de stack for (int i = 0; i < 100; ++i) arr[i] = i; printf("Eerste element: %d\n", arr[0]); } // arr wordt vernietigd na het verlaten van foo
Belangrijkste kenmerken:
Is het mogelijk om een lokale variabele per adres uit een functie te retourneren?
Nee, omdat de variabele wordt vernietigd na het verlaten van de functie, en de resulterende "hangende pointer" leidt tot onvoorspelbaar gedrag.
int* bad() { int x = 42; return &x; // fout: teruggegeven pointer wijst naar vernietigde stack }
Is het mogelijk om een grote array (bijvoorbeeld 1 MB) op de stack te plaatsen?
Voor de meeste systemen is de stack beperkt (van enkele tientallen tot honderden KBytes). Het proberen om enorme arrays op de stack te declareren leidt tot stack overflow.
Wat is het verschil tussen statische en automatische variabelen bij allocatie?
Statische variabelen (zelfs in een functie) worden in statisch geheugen geplaatst, worden niet gewist tussen aanroepen, terwijl automatische variabelen op de stack worden geplaatst en worden vernietigd bij het verlaten van het blok.
In een functie voor berekeningen werd een array van 8192*1024 doubles op de stack geplaatst. Het programma kreeg een SIGSEGV bij het opstarten in Linux, hoewel het zonder fouten compileerde.
Voordelen:
Nadelen:
Voor het werken met grote buffers werd dynamische geheugenallocatie via malloc/free gebruikt. Op de stack werden alleen kleine werkvariabelen geplaatst.
Voordelen:
Nadelen: