? En stak overflow er en type programmering fejl, som opstår, når et program forsøger at allokere mere hukommelse på kaldstakkens end der er tilgængelig . Det er en potentielt alvorlig fejl , der forårsager den fejlende program til at gå ned , og er som regel resultat af en af to design fejl . Stakken
stak refererer til en del af hukommelsen , der bruges til at gemme oplysninger om funktionerne i et program. De størrelser og tekniske detaljer af stakken vil være varierer afhængigt af programmeringssprog, compiler , operativsystem og processor type , og disse oplysninger er generelt skjult fra programmør i de fleste højere niveau sprog .
Eksempel stak
Overvej følgende eksempel i pseudokode : Hej
funktion a {1 . kalder funktionen b.2 . kalder funktionen c. . }
funktion b {1 . kalder funktionen C.2. Print Spot. }
Funktion c {1 . Oplag. }
Siden hver funktion kan kalde andre funktioner , stakken eksisterer for at holde styr på hvor i moderselskabet funktion til at fortsætte efter et barn funktion returnerer . Dette eksempel, hvis stoppet inde funktionen C, kan have en stak , der ser noget som dette : Hej
> A1 ---> B1 -------- > C1
< p > Siden den første linje af funktionen A opkald funktion B , og den første linje af funktion B kalder funktionen C. Efter funktionen C vil slutte , fortsætter programmet tilbage op kæden, der kører B2 og endelig A2.
Infinite Recursion
en stak overflow opstår, når et program forsøger at gemme for meget information på stakken . Den mest almindelige årsag til en stak overflow er et design fejl kaldes uendelig rekursion . Overvej følgende eksempel i pseudokode : Hej
funktion A {1 . kalder funktionen A. }
Og deraf stack : Hej
-> A1 ---> A1 -------- > A1 ------- ------- > A1 (og så videre)
Dem fortrolig med edb-programmering vil genkende dette som en variant af den uendelig løkke , undtagen i stedet køre for evigt , vil dette program i sidste ende forbruge alle hukommelsen på stakken , hvilket resulterer i et styrt og en stak overflow fejl.
Forebyggelse
stack overflow fejl opstår generelt , når de forsøger at gennemføre rekursive algoritmer , og nøglen at undgå de fleste fejl er at sikre, at følgende er tilfældet for alle rekursive implementeringer: rekursiv funktion skal indeholde en exit betingelse , som ikke skaber endnu et lag af rekursion og rekursive funktion skal være konstrueret således , at hvert lag af rekursion tilsat skal medbringe funktionen tættere på exit tilstand.
store lokale variable
En anden , langt sjældnere årsag stack overflow fejl er erklæringen af store lokale variable , som regel i form af arrays , der indeholder hundreder af tusinder eller millioner , af elementer. Den enkleste måde at undgå stack overflow i denne situation er at bruge pointere og dynamisk hukommelse tildeling for at undgå at erklære data på stakken, når sådanne hukommelse intensive operationer kaldes for.