1

雖然實際的實現是平臺特定的,但這個想法是潛在的危險緩衝區溢出的原因。例如,有沒有理由爲什麼內存中的數組'往往'下來,而功能堆棧通常'去'?

------------- 
| arr[0] | \ 
------------- \ 
| arr[1] | -> arr[3] is local to a function 
-------------/
| arr[2] |/
------------- 
| frame ptr | 
------------- 
| ret val | 
------------- 
| ret addr | 
------------- 
| args | 
------------- 

我的問題是,是否有一個原因,當地的陣列,因爲沒有更好的動詞,流下來了嗎?相反,如果數組流向上,它是否不會顯着減少覆蓋返回地址的緩衝區溢出錯誤的數量?

通過使用線程,可以覆蓋當前函數調用的函數的返回地址。但現在讓我們忽略它。

回答

2

堆棧上的數組就像堆上的數組一樣工作,即其索引隨着內存地址的增加而增加。

堆棧向下(向低地址)而不是向上增長,這是陣列向堆棧的相反方向前進的原因。這有一些歷史原因,可能從代碼,堆棧和堆棧駐留在同一個內存區域的時候開始,所以堆棧和堆棧從內存的每一端都增長。

+1

這個答案是最好的。您可以在這裏瞭解更多關於內存佈局的信息:http://dirac.org/linux/gdb/02a-Memory_Layout_And_The_Stack.php堆棧和堆堆棧的方向相反,以充分利用未使用的內存地址空間。 –

0

我不能引用這個來源,但我相信這是因爲你可以通過記憶。考慮while *p++或其他方面的內容。現在

,你可以很容易地說while *p--但我想,如果他們有一個選擇,他們寧願覆蓋其他人的數據比他們自己的返回值:)談論「貪心算法」(HAR HAR)

+0

這也是我想出來的原因。但編譯器當然不難做出適當的調整。我猜想可擴展性可能是一個問題。 – Ram

+0

編譯器是什麼意思做適當的調整? – corsiKa

+0

我認爲他的意思是讓彙編程序對堆棧的組織方式進行必要的調整 –

0

要獲得子陣列,通常只傳遞一個指向它的指針。任何索引操作都需要知道數組的大小,除非你想使所有的內存索引都向後 - 但如果你願意的話,你可能會陷入同樣的​​境地:P。

相關問題