? En stack overflow är en typ av programmeringsfel som uppstår när ett program försöker att allokera mer minne på anropsstacken än finns . Det är ett potentiellt allvarligt fel som orsakar den felande programmet att krascha och är oftast resultatet av ett av två misstag i designen . Stacken
stapeln avser en del av minnet som används för att lagra information om funktionerna i ett program . De storlekar och tekniska detaljer i stacken kommer variera beroende på programmeringsspråk , kompilator , operativsystem och processortyp , och dessa uppgifter är vanligen dolda programmeraren i de flesta högre nivå språk .
Exempel stack
Betrakta följande exempel i pseudokod :
funktion en { 1 . anropa funktionen b.2 . anropa funktionen c. . }
funktion b { 1 . anropa funktionen c.2 . Skriv Spot . }
Funktion c { 1 . Upplaga . }
Eftersom varje funktion kan anropa andra funktioner , finns stacken för att hålla reda på var i den överordnade funktionen för att fortsätta efter en avkastning barnets funktion . Detta exempel , om stoppad insida funktion c , kan ha en stack som ser ut ungefär så här :
> A1 --- > B1 -------- > C1
Sedan den första raden i funktionen A samtal funktion B , och den första raden i funktionen B anropar funktionen C. Efter funktionen C kommer att avsluta , fortsätter programmet tillbaka upp i kedjan , kör B2 och slutligen A2 .
oändlig rekursion
en stack overflow inträffar när ett program försöker att lagra för mycket information på stacken . Den vanligaste orsaken till en stack overflow är en design fel kallas oändlig rekursion . Betrakta följande exempel i pseudokod :
funktion A { 1 . anropa funktionen A. }
Och den resulterande stacken :
- > A1 --- > A1 -------- > A1 ------- ------- > A1 ( och så vidare ) katalog
de som är bekanta med programmering kommer att känna igen detta som en variant på oändlig slinga , förutom , i stället köra för evigt , kommer detta program att konsumera så småningom alla minnet på traven , vilket resulterar i en krasch och en stack overflow fel .
förebyggande
stack overflow fel uppstår i allmänhet när man försöker implementera rekursiva algoritmer , och nyckeln att undvika de flesta felen är att se till att följande gäller för alla rekursiva implementationer : den rekursiv funktion måste innehålla en exit tillstånd som inte skapar ytterligare ett lager av rekursion , och rekursiv funktion skall vara konstruerade så att varje skikt av rekursion tillsätts skall föra funktionen närmare exit tillstånd .
stora lokala variabler
annan , mycket mer sällsynt orsak till fel stackspill är förklaringen av stora lokala variabler , vanligtvis i form av matriser innehållande hundratusentals eller miljontals, element . Det enklaste sättet att undvika stackspill i denna situation är att använda pekare och dynamisk minneshantering för att undvika att förklara data på stacken när sådana minneskrävande funktioner kallas för . Addera