2

次のコードをコンパイルして、C でのスタック メモリ レイアウトの理解を確認し、gdb でアドレスを調べます。最下位桁のみを記録します。上位桁は同じです。出力は、

print \u &a 

簡単なテスト コードを次に示します。

void test(int a,int b)
{
  int c = a;
  int d = b;
  printf("%d,%d\n",c,d);
}

int main()
{
  int x = 1;
  int y = 2;
  test(x,y);
  return 0;
}

テスト関数フレームを見ると、次の結果が得られます。

&b: 6808 &a: 6812

&c: 6824 &d: 6828

$rbp: 6832 (フレーム ポインタ)。

私は混乱しています。関数パラメーターは、ローカル変数に対して上位のメモリ アドレスに配置しないでください。誰かがこれを詳細に説明できますか?ありがとう。

編集:次のようにメモリを印刷すると:

  printf("&a:%p,&b:%p\n",(&a),(&b));
  printf("&c:%p,&d:%p\n",(&c),(&d));

私は得た

  &a:0x7fff4737687c,&b:0x7fff47376878
  &c:0x7fff47376888,&d:0x7fff4737688c

それは逆順になります。a の終わりと c の始まりの間には 8 バイトのギャップがあります。私はそれがリターンアドレスになると思いますか?

4

1 に答える 1

0

関数の流れに従って、最初の引数が割り当てられ、次に内部引数が割り当てられます。あなたの懸念は、スタックが上向きに成長するという仮定に基づいています(これは必要ありません)。

詳細については、以下のリンクをたどってください: スタックは上向きまたは下向きに成長しますか?

于 2014-10-10T10:53:28.183 に答える