? En stack overflow er en type programmering feil som oppstår når et program forsøker å tildele mer minne på samtalen stabelen enn det som er tilgjengelig. Det er en potensielt alvorlig feil som forårsaker uakseptable programmet til å krasje og er vanligvis et resultat av en av to design feil . Stable-
Stabelen refererer til en del av minnet som brukes til å lagre informasjon om funksjonene til et program . Størrelsene og tekniske detaljer på bunken vil være variere avhengig av programmeringsspråk, kompilator , operativsystem og prosessor type, og disse detaljene er vanligvis skjult for programmerer i de fleste høyere nivå språk.
Eksempel stable
Betrakt følgende eksempel i pseudokode : en
funksjon et {1 . ringe funksjon B.2 . ringe funksjon c . }
funksjon b {1 . ringe funksjon C.2 . Skriv ut Spot. }
Funksjon c {1 . Skriv ut Run . }
Siden hver funksjon kan kalle andre funksjoner , finnes bunken for å holde oversikt over hvor i den overordnede funksjonen til å fortsette etter at et barn funksjon kommer tilbake . Dette eksemplet , hvis stoppet inne funksjon c , kan ha en stabel som ser omtrent slik ut : en
> A1 --- > B1 -------- > C1
< p > Siden den første linjen i funksjon A ringer funksjon B , og den første linjen av funksjon B kaller funksjonen C. Etter funksjon C vil fullføre , vil programmet fortsette tilbake opp i kjeden , kjører B2 og til slutt A2 .
Infinite Rekursjon
stack overflow oppstår når et program prøver å lagre for mye informasjon på stakken . Den vanligste årsaken til en stack overflow er et design feil kalles uendelig rekursjon . Betrakt følgende eksempel i pseudokode : en
funksjon A { 1 . ringe funksjon A. }
Og den resulterende stack : en
- > A1 --- > A1 -------- > A1 ------- ------- > A1 ( og så videre)
de er kjent med programmering vil gjenkjenne dette som en variant av den uendelig loop, bortsett fra, snarere enn å kjøre for alltid , vil dette programmet slutt konsumere alt minnet på stakken , noe som resulterer i en krasj og en stack overflow feil .
Prevention
stakkoverflytfeil oppstår vanligvis når du forsøker å gjennomføre rekursive algoritmer , og nøkkelen å unngå de fleste feil er å sikre at følgende gjelder for alle rekursive implementasjoner : den rekursive funksjonen må inneholde en exit tilstand som ikke skaper et lag av rekursjon , og den rekursive funksjonen må utformes slik at hvert lag av rekursjon lagt må bringe funksjonen nærmere exit tilstand .
store lokale variabler
annen , mye sjeldnere årsak til stakkoverflytfeil er erklæringen av store lokale variabler , vanligvis i form av arrays som inneholder hundretusener eller millioner, av elementer . Den enkleste måten å unngå stack overflow i denne situasjonen er å bruke pekere og dynamisk minne allokering å unngå erklære dataene på bunken når slike minne intensive operasjoner er etterlyste.