2012-10-06 43 views
1

堆棧指針差I具有如下一個char數組:爲字符指針和陣列

char buffer[100] 

並如下另一個char指針:

char *buffer 
buffer = malloc(100) 

當我使用GDB簽出堆棧指針,它們實際上是不同的。爲什麼?

+0

我看到至少有兩種不同的方法可以實例化'char buffer [100]'。在char *緩衝區塊內是'char buffer [100]'還是全局的?你問的問題爲什麼'char buffer [100]'出現在堆棧上而'buffer = malloc(100)'不是? 'malloc'沒有從棧中獲取內存。 – KeithSmith

+4

C中沒有堆棧或堆這樣的東西。這是一種常見的實現,但它不是標準所要求的。 –

+0

這個問題會不斷出現。我們應該保持這個問題的開放性,並將其他人視爲偶像,因爲這有一個很好的答案(漂亮的照片)。 –

回答

12

這是因爲char buffer[100]將被分配到堆棧上,這將佔用100個字節的存儲空間。因此,堆棧指針esp/rsp將指向下一個存儲器(服用棧向下增長)

+- +------------+ <-- ebp 
|  |   | 
b  +------------+ 
u  |   | 
f  +------------+ 
f  |   |  holds 100 elements of buffer array  
e  +------------+ 
r   . 
      . 
a   . 
r  +------------+ 
r  |   | 
+- +------------+ <-- esp 

並要在char *buffer只有一個char *類型的對象的存儲器(sizeof (char *))將在堆棧上被分配的情況。當您執行buffer = malloc (100)時,將返回保證100字節的內存塊的基址。這個分配的內存通常從堆中取出。因此現在buffer保存剛分配的內存塊的基地址。所以,在這種情況下,因爲該存儲器是從堆中,堆棧僅保持char *類型的對象,因此,堆棧指針是在更高的位置(以向下生長堆棧)

+------------+ <-- ebp 
    | 0xabcd |    buffer , char * type 
    +-----+------+ <-- esp 
      | 
      | 
      |    0xabcd 0xabce 
      |    +-----+-----+-----+  +-----+-----+ 
      +------------>|  |  |  | . . . |  |  | 
         +-----+-----+-----+  +-----+-----+ 
            0xabcf . . . 

         |          | 
         +------ 100 bytes mem block in heap --+ 

還要注意理查德·J·羅斯III的評論。