Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
zásobník volaní , najčastejšou príčinou pretečeniu zásobníka , má zoznam návratových adries pre jednotlivé funkcie alebo volanie metódy . Keď začne program , zásobník volaní je prázdny , a potom , keď sa prvýkrát volaná funkcia , adresa riadku bezprostredne po volaní funkcie dostane tlačil na zásobníku . Ak funkcia skončí , spiatočná adresa dostane vyskočila z kôpky a vykonávanie pokračuje na tejto adrese . Zásobník rozširuje a zrúti sa v závislosti na počte vnorených volaní funkcií .
Rekurzia
rekurzia nastáva , keď funkcia volá seba . Zoberme si nasledujúci kód : Spojené
Funkčné countNodes ( uzlov ) pre každú childNode v nodenodeCount + = 1countNodes ( childNode ) DalšíKonec funkcie klipart
Použitie nejakú stromovú štruktúru ako XML dokumentu , tento kód sa počíta počet uzlov stromu nájdených v rámci daného uzla . Každé dieťa uzol dostane počíta , potom je odovzdaný do rovnakej funkcie počítať svoje podriadené uzly . Tento postup sa opakuje , až kým dieťa nemá žiadne deti
Predpokladajme , že programátor napísal uzol namiesto podriadený uzol takto : .
Funkcia countNodes ( uzol ) pre každú childNode v nodenodeCount + = 1countNodes ( Node ) DalšíKonec funkcie
V tomto prípade bude funkcia volať donekonečna a pretečenie zásobníka dochádza .
Skrytá Rekurzia
Vo väčšine prípadov , vývojári nie sú zámerne písať rekurzívne kódu , ale rekurzia môže dôjsť v jemnejších spôsobov . Zoberme si tieto tri funkcie :
Funkcia loadAccount ( ) LoadMainAccount ( ) loadTransactions ( ) End funkcie
Funkcia loadMainAccount ( ) loadAssociatedAccounts ( ) end funkcie
funkcie loadAssociatedAccounts ( ) loadAccount ( ) end funkcie celým
V tomto prípade , rekurzia dochádza nepriamo , keď funkcia volá inú funkciu , ktorá volá nechtiac prvú funkciu . Výsledkom môže trvať trochu dlhšie , ale výsledkom je pretečenie zásobníka .
Veľké Parametre
Okrem sledovania funkcie volania , návratové body , zásobník môže tiež držať iné dáta . Väčšina jazyky používajú zásobník držať parametre funkcií a títo sú zvyčajne len ukazovatele adresa lokalít parametrov . Niektoré jazyky tlačiť parametrov hodnotou na zásobníku , a to môže trvať podstatne viac miesta . Predvolenú veľkosť zásobníka pre väčšinu jazykov v rozmedzí od 512 kB do 1 MB , takže veľké parametre odovzdávané hodnotou mohla občas spôsobiť pretečenie zásobníka . Ak je potreba prejsť veľké parametrov hodnotou , obráťte sa na referenčnú príručku jazyka zistiť , ako zvýšiť stack premenné .
Instance
Premenné inštancie sú tie vložené vnútri funkcie . Napríklad :
Funkčná vzorka ( ) N = getCounter ( ) Return n * 12End funkcia
Premenná n je premenná inštancie , pretože existuje iba , keď vzorka funkcie vykonáva . V mnohých jazykoch , n dostane tlačil do zásobníka , potom vyskočila off , kedy funkcia ukončí . To funguje dobre pre jednoduché premenné , ako sú celé čísla a znaky , ale môže naplniť zásobník pri použití veľké pole . Keď sa to stane problém , zvážte použitie vstavané dátové štruktúry , ako sú reťazce alebo zoznamy . Tieto štruktúry sa zvyčajne alokovať pamäť na halde , samostatný , oveľa väčšie oblasti pamäte .