我最近想過這種情況下堆棧溢出:在這種情況下,無限遞歸調用應該引發堆棧溢出?
int f()
{
return f();
}
int main(void)
{
f();
return 0;
}
,這肯定導致程序崩潰。但我的問題是,爲什麼這與一個無限循環不一樣?在返回線路遞歸調用的情況下,編譯器可以意識到不需要保留調用函數的任何信息,因爲到被調用函數的返回點與調用者的返回點相同。 現在,在這種情況下,我同意編譯器需要保持在堆疊使得呼叫功能的信息:
int f()
{
int x = f();
return x;
}
int main(void)
{
f();
return 0;
}
可以肯定,我失去了一些東西,我想如果有人就向我解釋欣賞。問候
嘿謝謝:D。這是一個非常有幫助和完整的解釋,是的,這幾乎是我所關心的:編譯器在這些情況下有多聰明。 – Juste 2011-03-17 22:12:22
@ Nicolas-很高興幫忙!順便說一句,如果你喜歡這裏的任何答案(即使它不是我的),你應該接受它,以便問題被標記爲已解決。 – templatetypedef 2011-03-17 22:15:12
完成xD。我仍然在學習瀏覽這個網站lol。我非常喜歡所有的答案,你的答案是最完整的,儘管謝謝^^ – Juste 2011-03-17 22:26:12