2014-10-10 138 views
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。我想這應該是回信地址?

+10

一些堆疊向上生長,別人向下。取決於系統。 – dandan78 2014-10-10 07:49:48

+4

如果您實際在代碼中打印了變量的地址,您的代碼和結果將更有意義,例如'printf(「%p,%p \ n」,&a,&b);'test'()'內 – unwind 2014-10-10 07:50:50

+3

OP似乎在檢查調試器中的地址 – dandan78 2014-10-10 07:54:25

回答

0

根據函數的流程,分配第一個參數,然後分配內部參數。 您的擔憂是基於堆棧向上生長的假設(這不是必需的)。

請按照下面的鏈接,更多的瞭解: Does stack grow upward or downward?