回答
問題是功能f
自己調用。這會造成無限循環,導致堆棧崩潰並導致程序崩潰。
你期待這個功能應該做什麼?
void f {
f();
}
第一個函數(f
)是一個遞歸函數。在每次撥打f
時,將再次調用功能f
。這會導致創建新的堆棧幀。現在,沒有退出條件,因此f
將被重複調用。最終,您將用完堆棧框架,併發生stackoverflow。
有兩種方法可以解決這個問題。
1.使用尾遞歸優化。
爲此,如果使用gcc,請使用-O2進行編譯。所以,使用下面的命令。
gcc -O2 $filename -o $executableName
這將針對尾遞歸優化f
,本質上創建一個無限循環,而不是在程序集中創建跳轉和鏈接。
請注意,尾遞歸優化只有當你在函數中做的最後一件事情是調用另一個函數(也就是說,如果你最後一件事情導致不再需要堆棧幀),它將起作用。
2.添加退出條件
這取決於你想要做什麼。假設你想遞歸三次。然後,您需要在每次通話時將參數傳遞給f
。然後,在f
中,檢查退出條件是否爲true
。如果是這樣,只需return
。如果不是,則用一個新參數再次調用f
。
這個答案(1)只有在你認爲OP會選擇一個鎖定的程序並且必須手動殺死一個崩潰的程序時纔有意義。我不明白你爲什麼這麼說。 –
@ChrisBeck好吧,我假設OP公佈了代碼作爲例子。也就是說,在遞歸調用'f'中的'f'之前,OP可能會有一些代碼,包括退出條件。在這種情況下,如果遞歸調用在達到退出條件之前可能超過堆棧幀限制,則尾遞歸變得有用。 – nehcsivart
- 1. 堆棧溢出/ SEG故障
- 2. 堆棧溢出錯誤android
- 3. java堆棧溢出錯誤?
- 4. JWS堆棧溢出錯誤
- 5. 堆棧溢出錯誤(Java)
- 6. 堆棧溢出錯誤
- 7. 堆棧溢出錯誤
- 8. ArrayLists堆棧溢出錯誤
- 9. 堆棧溢出錯誤?
- 10. Eclipse - 堆棧溢出錯誤
- 11. 堆棧溢出錯誤
- 12. 堆棧溢出錯誤
- 13. C++堆棧溢出錯誤
- 14. 如何解決堆棧溢出的Android
- 15. 我不知道如何解決堆棧溢出錯誤
- 16. 如何解決Visual C/C++中的堆棧溢出錯誤?
- 17. 如何解決vba中的堆棧溢出錯誤28 Excel中
- 18. 我該如何解決這個堆棧溢出錯誤?
- 19. 我該如何解決這個堆棧溢出錯誤?
- 20. 堆棧溢出堆棧溢出
- 21. 什麼是雙重故障?將它應用到堆棧溢出
- 22. 堆棧溢出的非託管:IP:0x26eb76,故障地址:0xbf808ffc
- 23. 堆棧溢出錯誤出現
- 24. minimax algorim堆棧溢出錯誤
- 25. 八叉堆棧溢出錯誤
- 26. 防止堆棧溢出錯誤
- 27. 也能收到堆棧溢出錯誤
- 28. Lisp編程錯誤(堆棧溢出(深))
- 29. jquery fileupload錯誤堆棧溢出
- 30. AddressSanitizer:堆棧溢出地址錯誤?
「*堆棧溢出問題通常是由損壞的註冊表項引起的。*」* LOL * – alk
這是沒有基本情況的遞歸 - >無限循環 – sam
這是一個巨魔,我打賭...... :-) – alk