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

我有一个char数组如下:

  char buffer[100] 

另一个char指针如下:

  char *buffer buffer = malloc(100) 

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

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