2
我嘗試通過編譯以下代碼來驗證我對C中堆棧內存佈局的理解,並檢查gdb中的地址。我只記錄最不重要的數字,更高的數字是相同的。輸出是通過使用C堆棧內存佈局
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 &一:6812
& C:6824 & d:6828
$ rbp:6832(frame pointer)。
我很困惑。對於局部變量,功能參數不應該佔用更高的內存地址。有人可以詳細解釋這個嗎?謝謝。
編輯: 如果我打印內存不足,如:
printf("&a:%p,&b:%p\n",(&a),(&b));
printf("&c:%p,&d:%p\n",(&c),(&d));
我
&a:0x7fff4737687c,&b:0x7fff47376878
&c:0x7fff47376888,&d:0x7fff4737688c
原來是在B A C d秩序。 a和a之間有8個字節的間隔c。我想這應該是回信地址?
一些堆疊向上生長,別人向下。取決於系統。 – dandan78 2014-10-10 07:49:48
如果您實際在代碼中打印了變量的地址,您的代碼和結果將更有意義,例如'printf(「%p,%p \ n」,&a,&b);'test'()'內 – unwind 2014-10-10 07:50:50
OP似乎在檢查調試器中的地址 – dandan78 2014-10-10 07:54:25