2010-09-08 96 views
1

大部分體系結構具有存儲器映射,其中用戶應用程序的增長朝 其中堆棧增長至相反的方向下存儲器。我想知道,當我寫的所有的應用程序 空間和被帶走,即堆棧指針和應用程序試圖寫入內存中的同 區這麼大的C-程序什麼 是怎麼回事?我假設在C中發生了類似於分段錯誤的事情?有沒有 任何處理器支持,試圖避免這樣的問題發生?堆棧指針VS應用

感謝

回答

1

沒有,在C你可以走出記憶,你只能直接如果你實際檢查的malloc等人返回值注意。否則,您可能會在某處解除引用空指針,導致您的應用崩潰。但可能有可能沒有直接的可見跡象,只有你的記憶被無聲地破壞。由於應用程序的內存空間由應用程序本身管理,因此處理器/操作系統無法檢測到此類錯誤。在現代操作系統中,操作系統本身和其他應用程序的內存空間受到應用程序的保護,因此如果您不小心嘗試寫入內存空間以外的內存,則可能會出現分段錯誤。但是在你自己的記憶空間裏,保護你的記憶取決於你自己。

1

堆棧指針是有限的。一旦嘗試超出允許範圍,您通常會得到異常或中斷,導致程序終止。這通常發生在失控遞歸函數中。

類似地,對於堆棧空間被保留,而且給堆分配不可訪問。當你嘗試做一個堆分配(mallocnew)沒有足夠的空間,分配器通常會返回NULL或拋出一個OutOfMemory例外。

我,說答案不同意「不會有直接的明顯跡象,只有你的記憶被默默損壞。

你要麼得到一個StackOverflowOutOfMemory,取決於其資源被疲憊不堪。

+0

我認爲,除非你專門尋找異常,否則當你嘗試在填滿所有內容後嘗試訪問內存時,你會在某個時間段執行segfault/segv ...... – 2010-09-08 17:19:44

+0

Aaron:不會有任何內存損壞,空指針(或者它的一個小偏移量)將會失敗而不會破壞內存,並且嘗試執行超過堆棧末尾的調用也將失敗:當OS異常/信號發生時,程序的狀態將會生效你保證能夠恢復。 – BCoates 2010-09-08 17:25:37

+0

@bcoats,我不是說會有,我只是指出你實際上並沒有C中的「例外」,即沒有投擲。這並不是非常重要的一點...... – 2010-09-10 21:55:43

1

Abelenky是正確的,現代建築將捕獲堆棧增長過去的一些限制比所有可用的地址空間小得多(這是很容易用一個簡單的遞歸函數進行測試)

此外,「應用向下增長,堆增長up「並不真正描述多線程系統的內存映射,每個線程都有自己的堆棧,它有一個預先設置的最大值大小,堆是一個或多個單獨映射的地址空間區域。

算出這個東西了,最簡單的方法是將一個調試器附加到一個簡單的測試程序;你可以看到你的進程在任何體面的內存區域使用。一定要查看你的庫和代碼的加載位置,以及多於一個線程值的堆棧。