2012-10-06 42 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的评论。