2011-04-05 66 views

回答

4

因爲未定義的行爲意味着正好是 that:undefined。未定義,但將導致錯誤,但未定義,意思是任何事情都可能發生。

有時,什麼可能是它按預期工作。當然,這並不是一件好事,因爲它可能會停止按預期工作,具有新的編譯器或操作系統或運行時庫,甚至基於星期幾或月相。

ISO標準規定了一個明確定義的程序將如何表現,他們並沒有強制要求一個未定義的程序,除非說它可以做任何它令人討厭的事情。

對於特定的情況,您必須檢查編譯器生成的彙編代碼,以瞭解它爲什麼不會毀壞您的堆棧。 Linux可能會在覆蓋的位置存儲相當重要的信息(如main的返回地址),而Windows存儲相對良性的信息(如來自main的返回碼)。

+0

不應該'bp'之前的地址總是返回地址? – 2011-04-05 03:54:55

+2

不是。該標準對於使用的調用約定或者位於堆棧中的事情,甚至是甚至存在bp寄存器都沒有什麼可說的:-)我回答了先前的問題,其中使用完全相同的編譯器,堆棧差異很大,除了優化級別以外的其他一切:http://stackoverflow.com/questions/5536564/stack-layout-for-process/5536611#5536611 – paxdiablo 2011-04-05 03:57:51

+0

我懷疑在Windows上是否發生了段錯誤? – 2011-04-05 14:55:00

相關問題