2015-05-05 148 views
1

我最近被要求考慮下面的代碼的輸出的輸出:解釋代碼

#include <iostream> 
int gvar; 
int main (void) 
{ 
    cout << &gvar << endl; 
    while (true); 
    return 0; 
} 

該代碼被編譯並生成一個可執行文件。如果這個可執行文件在run 2終端中並行。它會打印什麼。

我的回覆是它會打印2個不同的地址。但在跑步時,我發現在兩個終端上都印有相同的地址。

有人可以解釋爲什麼會發生這種情況。我知道這可能是由於虛擬內存造成的,但我無法將它們放在一起。

+0

我認爲這比任何語言都更關聯編譯器。 –

+0

很可能你正在獲取可執行文件堆棧空間中的內存地址,如果是這種情況,那麼它應該是相同的地址。 – NathanOliver

+0

@NathanOliver不是那麼重要,但沒有那個變量不應該在棧上。畢竟,這是一個全球變量。 – unwind

回答

5

這很明顯是由於虛擬內存,是的。

這樣的代碼看到的地址是虛擬的。由於每個進程都有其自己的虛擬到物理映射表,因此每個進程內的虛擬地址不必是唯一的。

+0

但這是否意味着每次它會返回相同的地址。如在,它可能已經打印了一個完全不同的地址,在映射時會返回一個不同的物理內存地址。 ? – ShReYaNsH

+0

@ShReYaNsH是的,它可以,但這些是操作系統中的實現細節。它可以選擇隨機化使用的虛擬地址,也可以不是。 – unwind

+0

所以我的理解是,這只是一個共同點,相同的地址正在打印。雖然看起來相同的地址將映射到物理內存中的不同地址。那是對的嗎 ? – ShReYaNsH