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

于 2012-10-06T13:38:54.910 に答える