我有一个char数组如下:
char buffer[100]
Run Code Online (Sandbox Code Playgroud)
另一个char指针如下:
char *buffer
buffer = malloc(100)
Run Code Online (Sandbox Code Playgroud)
当我使用GDB检查堆栈指针时,它们实际上是不同的.为什么?
pho*_*xis 13
这是因为char buffer[100]将在堆栈上分配,这将占用100个字节的存储空间.因此堆栈指针esp/ rsp将指向较低的内存(使堆栈向下增长)
+- +------------+ <-- ebp
| | |
b +------------+
u | |
f +------------+
f | | holds 100 elements of buffer array
e +------------+
r .
.
a .
r +------------+
r | |
+- +------------+ <-- esp
Run Code Online (Sandbox Code Playgroud)
并且在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 --+
Run Code Online (Sandbox Code Playgroud)
另请注意Richard J. Ross III的评论.