2014-02-18 45 views
1

我有這樣的代碼寫在C:我理解堆棧嗎?請指正

int main(){ 
    double x, y; 
    int a, b, c; 
    int *p; 

,我有:

sizeof(int)=4 
sizeof(double)=8 

是內存結構某事像這樣? 在圖形模式下更詳細:

IN MEMORY:(whole memory) 
    LE = Little Endian (INTEL) 
    BE = Big Endian  (MIPS) 

                ------------------ 
            0x00000000 |     | ? 
                ------------------ 
             .     . 
             .     . 
             .     . 
                ------------------ 
            0x0012ff60 | 64(LE) 00(BE) | 
                ------------------ 
                ------------------ 
            0x0012ff61 | ff(LE) 12(BE) | 
                ------------------ 
                ------------------ 
            0x0012ff62 | 12(LE) ff(BE) | 
                ------------------ 
                ------------------ 
            0x0012ff63 | 00(LE) 64(BE) | 
                ------------------ 

                ------------------ 
            0x0012ff64 | 00(LE) 00(BE) | c   if c = 256  (base10) 
                ------------------    c = 0x00000100 (base16) 
                ------------------ 
            0x0012ff65 | 01(LE) 00(BE) | c 0x0012ff64 points to c variable 
                ------------------  0x0012ff64 is a pointer 
                ------------------ 
            0x0012ff66 | 00(LE) 01(BE) | c 
                ------------------ 
                ------------------ 
            0x0012ff67 | 00(LE) 00(BE) | c 
                ------------------ 
                ------------------ 
            0x0012ff68 |     | b 
                ------------------ 
                  . 
                  . 
                  . 
                ------------------ 
            0x0012ff6c |     | a 
                ------------------ 
                  . 
                  . 
                  . 
                ------------------ 
            0x0012ff70 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff71 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff72 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff73 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff74 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff75 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff76 |     | y 
                ------------------ 
                ------------------ 
            0x0012ff77 |     | y 
                ------------------ 
                  . 
                  . 
                  . 
                ------------------ 
            0x0012ff78 |     | x 
                ------------------ 
                  . 
                  . 
                  . 
                ------------------ 
            0xfffffffff |     | ? 
                ------------------ 

我的問題: 當我們將某物分割棧,我們該怎麼做呢? enter image description here

1)我的意思是我們推動數據在地址的更高值的堆棧結束?

2)或者我們在地址較低的地方將數據壓入棧頂?

3)每個堆棧有多少內存地址?取決於什麼?

感謝

+1

ebb寄存器不指向返回指令指針,而是指向前一個函數的ebp – BlackBear

+2

不要忘記,編譯器可以(也可能)將局部變量存儲在寄存器中 - 部分或全部可能不會在所有的堆棧。 – Brendan

+2

請注意,即使EBP寄存器的含義可能依賴於編譯器:當使用優化時,甚至可能根本不使用EBP。但是在大多數情況下,x86機器上的堆棧就像你理解的那樣工作。但是在x86上,所有的數據都是小端的! –

回答

3

在x86機器,如果編譯器沒有做什麼特殊之處,堆棧將向下增長。在push上,堆棧指針將遞減大小,並且push ed數據將進入堆棧的較低地址。

pop上,堆棧指針會增加彈出的大小。

我不評論MIPS,即使你在你的問題中提到它,因爲:

  1. 我不知道MIPS架構
  2. 你的問題被標記x86什麼。

關於堆棧上每個變量的大小,這是100%編譯器相關的,所以我不能對此發表評論。

+0

好吧,我真的不在乎'MIPS',我是否正確地編寫了「INTEL」的內存結構?我在我的帖子中有3個問題,如果你更詳細地回答,我會很感激:) – MLSC

+1

他還問(總)尺寸(我認爲)。這是由編譯器選擇的(並且通常受操作系統的限制)。在'gcc'中,你可以用'--stack'選項來改變它。現代機器的典型價值是1 MB;現代Linux通常具有10 MB('ulimit -s')的限制。 – TypeIA

+1

@MortezaLSC:它看起來非常好。此外,請注意,您提出了**兩個**問題,因爲(1)和(2)是彼此相反的。 –