2013-08-31 71 views
1

我以爲變量的內存地址變得越來越大,直到我試圖驗證碼:爲什麼變量的地址變小?

#include <stdio.h> 

int main() 
{ 
    int IamfirstVariable = 9; 
    char array1[10] = {'0','1','2','3','4','5','6','7','8','9'}; 
    char array2[10] = {'0','1','2','3','4','5','6','7','8','9'}; 
    char IamLastVariable = '0'; 
    printf("variable start :%p\n",&IamfirstVariable); 
    printf("array1 address start :%p end : %p \n",&array1[0],&array1[9]); 
    printf("array2 address start :%p end : %p \n",&array2[0],&array2[9]); 
    printf("variable end :%p\n",&IamLastVariable); 
    return 0; 
} 

輸出:

variable start :0xbfb02c3c 
array1 address start :0xbfb02c32 end : 0xbfb02c3b 
array2 address start :0xbfb02c28 end : 0xbfb02c31 
variable end :0xbfb02c27 

我爲此stucked。看來最後聲明的變量得到最小的地址!

任何人都可以解釋這對我嗎?

----------------------編輯----------------------- -----------------

我讀答案的聯繫,並得到了anohter問題:

由於堆棧煥發downaward,數組爲什麼仍然地址向上發光?

+0

如果您有興趣,請嘗試使用堆而不是堆棧,然後查看結果。 –

+0

@YuHao我試過了,它給了我不連續但是增長的內存地址。我可以理解這一點,但我仍然無法理解堆棧向下發展的原因!它只是有一個堆棧限制? –

+0

因爲在很多平臺上,堆棧向下增長,而堆棧向上增長。嘗試在內存中搜索堆棧和堆的圖像。一張照片比任何單詞都多。 –

回答

3

由於在Intel堆棧生長向下(參見例如https://stackoverflow.com/a/1691818/613130)。您的array1array2是本地變量分配在堆棧上。請注意,這是平臺特定的,而不是特定於C的。在不同的平臺上,可以向上增長

如果你有興趣在其架構有一個成長向上或向下堆棧,類似的問題已經被問:https://stackoverflow.com/a/664779/613130

+0

我在這種情況下使用了由AMD –

+0

@LidongGuo Intel == AMD製造的CPU,因爲它們都使用x86/x64 ABI。 – xanatos

+0

爲什麼數組地址仍然向上增長? –

2

因爲變量存儲在堆棧中。

堆棧內存分配使用一個非常簡單的算法:堆棧指針指向第一個空白空間,並在每次添加變量時向下移動。

參見:Understanding the Stack

+0

「向下移動」意味着移動到較小的地址? –

+0

爲什麼數組地址仍然向上增長? –

1

讓我們看看空棧

0x00000000 |  | 
    :  |  | 
    :  |  | 
    :  |  | 
    :  |  | 
0xFFFFFFFF |  | ==>position of stack pointer 
      -----------  

時可變一個聲明,內存到var1將被分配在堆棧中,然後堆棧指針位置出現。

0x00000000 |  | 
    :  |  | 
    :  |  | 
    :  |  | 
    :  |  |==>position of stack pointer 
0xFFFFFFFF | var1 | 
      ----------- 

當變量2聲明時,內存到var2將被分配在堆棧中,然後堆棧指針位置到達。

0x00000000 |  | 
    :  |  | 
    :  |  | 
    :  |  |==>position of stack pointer 
    :  | var2 | 
0xFFFFFFFF | var1 | 
      ----------- 

所以最後聲明的變量獲取最小地址並首先聲明變量獲得最大地址。