堆栈指针和数组的指针差异

时间:2012-10-06 13:31:12

标签: c

我有一个char数组,如下所示:

 char buffer[100]

另一个char指针如下:

 char *buffer
 buffer = malloc(100)

当我使用GDB检查堆栈指针时,它们实际上是不同的。为什么呢?

1 个答案:

答案 0 :(得分:13)

这是因为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 --+ 

另请注意Richard J. Ross III的评论。