2012-03-25 22 views
5

我只是好奇,如果堆棧和堆上的變量(指針)的地址長度之間有任何關聯。在很多情況下,我已經看到,與堆相比,堆棧變量通常更長。例如,考慮下面的簡單的測試:棧和堆上的內存位置模式

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int i = 0; 
    int *j = malloc(sizeof(int)); *j = 0; 

    printf("&i = %p\n j = %p\n", &i, j); 

    free(j); 
    return 0; 
} 

輸出:

&i = 0x7fffe9c7fa5c 
j = 0x100e010 

這些結果在使用Linux的gcc獲得;這可能是操作系統/編譯器依賴?

+0

不是100%確定,但我會假定它是CPU/OS /編譯器特定的順序。另外,你甚至可能看不到物理地址。此外,堆增長並且堆棧增長減少,所以堆棧變量的地址低一些是有道理的。 – Corbin 2012-03-25 04:29:19

回答

2

結果取決於程序地址空間中堆的位置和堆棧的位置。這些由連接器和處理器架構決定。

由於ASLR,確切的數字在現代系統上應該是隨機的。

儘管如此,堆通常會向上堆積並向下堆積。此外,出於性能和內存管理的原因,堆棧和堆棧始終始於page邊界。

2

我相信這是因爲內存的物理部分,我們決定將它們稱爲堆棧和堆。由於它們從兩端開始向中間延伸,因此一個較低而另一個較高是合理的。如果你在棧上分配2個連續的變量和在堆上分配2個連續的變量,會發生什麼情況會很有趣。這將有助於瞭解棧和堆的增長方式。其實我認爲這個工作,你需要做一個新的堆棧框架(一種新的方法),並分配第二個變量,否則你仍然在同一個堆棧框架。

+0

對於普通的用戶空間程序,地址空間與物理內存地址無關。否則,非特權進程可能會通過分配一些特定的物理內存來啓動DoS攻擊,從而阻止另一個進程分配相同的內存地址。這都是虛擬的。 – phihag 2012-03-25 04:51:08

+0

它可能是物理或虛擬內存,具體取決於您的系統。無論如何,從兩端開始向中間增長,爲您在使用所有可用空間方面提供最大的靈活性。 – 2012-03-25 08:45:24