2013-11-25 144 views
0

我有一個功能,在功能上,我有兩個變量相同的模式,變量內存地址

int auth_flag = 0; 
    char buffer[16]; 

現在,這裏是GDB命令的輸出x/s buffer

0xffffd01c: "\201\203\004\b\344\203\373\367\002" 

並輸出print &auth_flag

$1 = (int *) 0xffffd018 

現在,我們從第e輸出auth_flag的位置是緩衝區之前的4個字節。現在,如果我宣佈變量這樣

char buffer[16]; 
int auth_flag = 0; 

上述命令的輸出是

0xffffd00c: "\201\203\004\b\344\203\373\367\002" and 
$1 = (int *) 0xffffd008 

同樣的事情。後面有100個字節,但順序相同。我的qs是,正如我已經顛倒了變量聲明,爲什麼沒有在gcc中將變量的地址順序顛倒過來。我正在閱讀一本書,說地址應該顛倒過來,但是這不會發生在我的電腦中。所以我很困惑。

+0

強制沒有優化也許? '#pragma OPTIMIZE OFF' – Leonardo

+0

@Leonardo:一個非常糟糕的想法。即使它在這種情況下起作用,也是非常具有誤導性的,因爲該語言不能保證編譯器分配自動變量的位置。 –

回答

4

如果自動變量表示自動變量在標準C或C++中彼此具有任何特定的地址關係,則可以刻錄該書。 structclass中的字段具有實現定義的佈局。自動變量甚至不能保證分配給內存。

現在,C++ 確實保證是在成爲已定義的符號(內存佈局問題,編譯時間結構,而不是)的順序,以及什麼樣的順序構造得到調用。例如,爲了定義以下什麼代碼意味着以一種精確的方式:

int foo(int x) 
{ 
    int y = x; // this sees the argument x 
    int x = 3; // this defines an automatic variable named x that shadows the argument 

    return x + y; 
} 

C++還對物體的構造和破壞順序做出保證。 (當它們按照外觀順序進入範圍時構建,當它們離開範圍時以相反的順序被破壞)。但是,我不會深入研究這一點,因爲這超出了你的問題。

+0

這個變量在函數中。 –

+0

函數的局部變量是自動變量。它們通常(但不總是)分配在堆棧上。語言唯一的保證是當它們進入範圍時自動爲你分配它們,並在你超出範圍時自動刪除它們。 –

+0

根據你的變量名判斷,你不會碰巧正在寫緩衝區溢出,對嗎? ;-) –