私は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
また、型オブジェクトが1 つだけの場合は、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 のコメントにも注意してください。