2

我有一个char数组如下:

 char buffer[100]

另一个char指针如下:

 char *buffer
 buffer = malloc(100)

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

4

1 回答 1

14

那是因为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 的评论。

于 2012-10-06T13:38:54.910 回答