2014-01-07 44 views
2

我運行如下代碼:函數調用時如何將本地變量組織在堆棧中?

void func() 
    { 
     int i; 
     int array[10]; 

     cout << &i << endl; 

     for(int i = 0; i < 10; ++i) 
     { 
      cout << &array[i] << '\n'; 
     } 
    } 

輸出爲:

0x28fe98 
    0x28fe70 
    0x28fe74 
    0x28fe78 
    0x28fe7c 
    0x28fe80 
    0x28fe84 
    0x28fe88 
    0x28fe8c 
    0x28fe90 
    0x28fe94 

爲什麼i地址是0x28fe98
我認爲i的地址必須是&array[0] - 4
爲什麼i的地址其實是&array[9] + 4

+7

堆棧通常會向下增長,如果每個變量有多個元素,則每個變量都會向上。當然,依靠這一點並不好。 – chris

+0

我不太確定。但是我仍然會說,如果我錯了,我會去學習。預計您的數組將以constios方式進行分配,而不是代碼中聲明的所有變量。編譯器會在可行的情況下爲'i'分配內存 –

+0

實際上,無論實際是什麼,如果數組或結構中較早的元素的地址(它們具有相同的訪問說明符),operator <必須返回true )稍後再進行比較,爲什麼不在內存中真正做到這一點?這是我第一次評論的第二部分的一個很好的理由。至於向下增長,我還沒有充分研究它,但它可能更有效或傳統。 – chris

回答

5

爲什麼我的地址是0x28fe98?

它只是你的陣列

結束後位於我想我的地址必須是&數組[0] - 4

這是爲什麼呢?

爲什麼我的地址是& array [9] + 4其實是?

因爲i是你的陣列:)後

典型元素入棧和他們不會忽略減少,而堆限制增加,但除非你是在一個低的水平沒有代碼應該依賴於這個(asm等..)

+0

我的意思是爲什麼push序列不是'i','array [0]',...,'array [9]'。 – stamaimer

+0

@stamaimer因爲沒有標準說它必須是這樣的。而最常見的實現則相反。 AFAIK它只是一個簡單的方法來從堆棧中分離堆並使它們不會相互碰撞,直到使用該程序的所有虛擬內存爲止。 – Drax

+0

謝謝,這很有幫助。 – stamaimer

相關問題