2013-02-02 119 views
0

假設的最大數目,我們具備的功能:我的機器(I7)上函數的遞歸C++

void foo(int x) 
{ 
foo(x); 
} 

將運行約26萬次,產生分段錯誤。任何想法爲什麼發生?

+5

計算機上沒有任何限制,甚至沒有堆棧大小 –

+0

260k是相當不錯的。在其他一些環境中,它會減少很多。考慮更新/改進問題:標題(如何允許多遞歸)和帖子中的問題(爲什麼發生seg-fault)會發生分歧。 – 2013-02-03 00:08:46

回答

7

每次調用一個函數時,它都需要運行時棧上的空間。這是該函數本地的變量分配內存的地方。發生的事情是,你遞歸很多次,以至於堆棧空間不足 - 堆棧溢出。 (!這個網站的名稱)

參見:http://en.wikipedia.org/wiki/Stack_overflow

+0

+1 ..但允許的最大*遞歸是什麼?這是什麼因素?此外,示例情況*可能*在優化/內聯(由什麼/哪裏?)下TCO'd .. – 2013-02-03 00:07:13

+0

@pst,他的答案是否意味着它是類似於(堆棧空間量)/(空間量該函數採用堆棧)。我想象了下來。 編輯:這是忽略尾遞歸,這可能會永遠... –

+0

@DavidD我只是想繪製出更詳細的迴應。我有點好奇,如果C/C++有什麼具體的話(保證,禁止或宣佈UB)關於這種情況。 – 2013-02-03 00:12:47

0

每當一個函數被調用系統存儲的堆棧調用,在這種情況下,系統將繼續存儲函數調用,直到系統堆棧滿。這個狀態被稱爲堆棧溢出。