2015-10-07 64 views
0

所有在我的課本秀緩衝陣列的例子問題被存儲在堆棧,當返回地址改寫這個導致問題。但是,緩衝區總是處於堆棧狀態?我認爲一個數組將被寫入內存中的其他地方,而不是堆棧。緩衝區字符數組是否始終存儲在堆棧中?

+0

歡迎來到IS堆棧交換。一些更多的信息是有用的,比如你使用的是什麼編程語言,因爲不同的語言甚至不同的編譯器可能會以不同的方式處理數組中變量的存儲。 –

回答

0

聲明爲常量大小(請參見下面的示例)或立即初始化的局部變量緩衝區將存儲在堆棧中。

char x[20];char x[] = "this buffer";

即使它們隨後被傳遞到可變將保持存儲在棧上的函數。距執行功能更遠。

如果你一個緩衝,然後它會被保存在堆內存而不是在棧上分配內存。

char *x = (char *) malloc(LENGTH_OF_BUFFER);

這是當heap spraying可開採成爲必要。你看到堆棧中大多數緩衝區溢出的原因是因爲它是開始理解開發概念的最簡單方法。

1

緩衝器陣列通常存儲在棧上。但是,將它們存儲在堆或固定的內存位置是非常有可能的 - 這就是假設你正在處理區分堆棧和堆的語言(和體系結構)。

1

這主要取決於編譯器,你的緩衝聲明和函數的調用方式。

在C語言中,一般來說,局部變量被分配到堆棧以及爲函數調用提供的一些參數(在cdecl調用約定*中。其他調用約定可能通過寄存器或甚至通過透明堆分配在某些情況下)。

一些語言和編譯器將以不同的方式分配這些。例如,在Delphi中,你是否聲明瞭一個類型爲「string」的局部變量,實際的數據將被存儲在堆上,只有一個指針被分配給堆棧。

最後,程序員總是可以決定在堆(或全局內存)上顯式分配緩衝區。