2008-11-25 53 views
6

我想了解在後臺聲明和分配原始類型的過程。是基元分配的內存地址?

  1. int i;
  2. i = 3;

對於1),存儲器堆棧,其分配的空間,用於存儲名爲I 對於2 int類型的值),它的值3分配給上面保存的空間

那裏是否有內存地址? 從我的印象來看,內存地址總是與堆上的對象相關聯?

更新:

關於回覆:

所以,在堆棧上的每個變量,它們都被分配了一個內存地址,以及就像在堆中的對象。我對麼?

但是對於Java而言,情況並非如此?

回答

1

假設你在談論C或C++(我不知道),是的。您可以像這樣訪問地址:

int i = 3; 

int *k = &i; // k now is a pointer to i 

*k = 4; // assigns the value k points to (i) to 4, i is now 4 
0

堆棧緩衝區溢出還會發生什麼? :)有人必須寫一個指向堆棧的指針。

5

並不總是涉及地址。編譯器可以將變量放入寄存器,如果它發現他們的地址永遠不會被程序員使用。所以你不需要訪問主內存。例如,在你的代碼上面,什麼編譯器可以生成可能是那樣簡單

add $2, $0, 3 

把價值3到寄存器2.只要你創建一個指針,並使其指向變量,那麼你有一個地址,實際上。然後變量不能再只在一個寄存器中。

0

真正的堆棧是proccess虛擬內存的特殊區域,所以堆棧中的所有東西都有內存地址。由ESP(SP)註冊表(x86架構)支持的堆棧頭。堆棧地址通常低於內存地址,因爲堆棧位置更接近於初始內存的開始然後堆積。