因此,我明白當內存衝突(和本網站的標題)時堆棧溢出是什麼,但我不明白爲什麼堆棧中的新條目位於遞減內存地址中。爲什麼它們不在隨機存儲器地址中,難道不會更有意義,因此內存衝突不是問題?我猜測背後有某種優化原因?堆棧中的內存衝突
**編輯**
什麼我不知道是一個堆棧給出的地址空間X量。現在有道理,但帶給我一個後續問題。我可以明確說明我要分配給堆棧的內存量嗎?
因此,我明白當內存衝突(和本網站的標題)時堆棧溢出是什麼,但我不明白爲什麼堆棧中的新條目位於遞減內存地址中。爲什麼它們不在隨機存儲器地址中,難道不會更有意義,因此內存衝突不是問題?我猜測背後有某種優化原因?堆棧中的內存衝突
**編輯**
什麼我不知道是一個堆棧給出的地址空間X量。現在有道理,但帶給我一個後續問題。我可以明確說明我要分配給堆棧的內存量嗎?
「內存衝突」最好符合「緩衝區溢出」的術語,即在預定義空間之外寫入,但可能位於不同的已分配內存塊中。
堆棧溢出不是關於將內存分配寫入另一個內存分配之外的寫入。這只是關於寫入堆棧內存分配之外的事情。最有可能在堆棧之外有一個守衛內存頁面,它不會被分配給任何東西,並且會導致讀或寫嘗試的錯誤。
並且爲在棧上推送的每個值分配一個隨機地址使得很難在堆棧上找到數據(並且它不再是堆棧)。當編譯器或程序員知道後續的元素佔用後續地址時,只需從堆棧幀的基址指針計算這些地址就很容易。
它是有道理的我沒有意識到它在編譯時分配了x內存量。但是有沒有辦法明確指定要分配多少內存? –
不,它是在運行時分配的,你可以這樣做http://stackoverflow.com/a/2279084/111160 –
但是,用正確設計和編碼的程序觸發堆棧溢出是不太可能的,它是由最大的錯誤的時間 –
這個問題的答案可能很複雜,但基本上堆棧操作被認爲是處理器作爲代碼正常執行的一部分執行的非常原始的功能。 (保存返回地址和其他內容)
那麼你把內存管理代碼放在哪裏?你在哪裏跟蹤分配的地址或添加代碼來分配新地址?由於這些是處理器本身執行的基本操作,因此實際上沒有任何地方可以這樣做。
與保存代碼本身的內存類似,假定在代碼運行之前(並由堆棧寄存器指向)設置堆棧。實際上沒有任何地方可以將複雜的內存管理添加到堆棧內存中。所以,是的,如果沒有提供足夠的內存,堆棧將會溢出。
堆棧溢出是當你用完所有可用的堆棧空間。可用於堆棧的空間在大多數情況下只是系統設計人員選擇的任意限制。有可能改變這一點,但在現代系統中,這不是一個真正的問題 - 需要幾兆字節的堆棧的代碼,除非系統真的很大,可能沒有正確設計。
堆棧從「自定義」向零增長 - 它必須按照定義的方向走,否則很難跟蹤正在發生的事情,而較低的地址與更高的地址一樣好。它曾經是堆棧和堆彼此增長,這將允許使用大量堆棧的代碼,而不是堆積如此多的代碼來處理相同數量的內存,因爲使用少量堆棧和大量內存堆。但是現在,通常有足夠的內存空間可以將堆定義爲完全獨立於堆棧的某個位置。相反,通過在堆棧頂部有一個「保留」內存區域來檢測堆棧溢出,因此操作系統得到一個用於使用不可用內存的「陷阱」,並且應用程序可能會被終止。
http://en.wikipedia.org/wiki/Stack_overflow – eandersson