次のコードをコンパイルして、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 バイトのギャップがあります。私はそれがリターンアドレスになると思いますか?