2015-05-12 58 views
2

使用尺寸命令當我檢查以下的C程序的存儲器佈局,在Linux中使用命令size program_name檢查交流程序的存儲器佈局,我得到數據= 552,BSS = 8奇怪的結果而在linux

#include <stdio.h> 

int main() 
{ 
    return 0; 
} 

現在,添加一個未初始化的變量後,我仍然得到相同的結果,data = 552,bss = 8. 我在這裏期待bss = 12。

#include <stdio.h> 
int a; 
int main() 
{ 
    return 0; 
} 

如果我添加初始化值的變量,我得到了我所料,數據= 556,BSS = 12

#include <stdio.h> 
int a; 
int b = 10; 
int main() 
{ 
    return 0; 
} 

但是,如果聲明指針並使其指向初始化變量,我得到data = 568,bss = 8,,我不明白爲什麼。 (對我來說,這似乎是兩個指針和未初始化的變量已被添加到列表初始化!)

#include <stdio.h> 
int a; 
int b = 10; 
int * c = &b; 
int main() 
{ 
    return 0; 
} 

可有人請澄清這裏發生了什麼?

+5

也許在第一種情況下,'期待bss = 12',編譯器會優化_unused_和_unreferenced_變量'a'。 –

+0

但是第二種情況也會發生同樣的優化?或者它不會? –

+1

@Eregrith那裏發生了什麼? –

回答

0

DATA段保存所有初始化的數據。它包含在可執行映像中。由於b被初始化爲一個特定的值,它被包含在DATA中(在圖像中)。

BSS段包含所有單位化的可變因子。它只是圖像中包含的一個數字,加載程序將爲它分配內存並將其初始化爲零。因此a包含在這個數字中(包含在加載時爲其分配的字節數)。

c未初始化爲可置於DATA段中的值。因此,它包含在BSS段中,但是,在加載時,加載程序必須解析此地址,然後初始化c以將b實際放置在內存中。

注意:作爲此策略的結果,ab在內存中不是連續的。這可以使調試內存問題變得更困難。可能調試的程序版本會使它們連續可以調試程序。

+0

但是我得到的結果(在問題陳述中給出)並不像你說的那樣。這就是爲什麼我問這個問題。即使在創建一個未初始化的變量之後,內存佈局也沒有變化。如果我認爲這是一種優化,當我們也有一個初始化變量(它們都出現在它們各自的段,bss和數據,給出正確的輸出)時,也不會發生這種情況。 –

+0

Hishant,您是否嘗試過禁用所有優化的編譯?你能否將return(0)更改爲return(a),以確保它沒有被優化掉?檢查他的彙編代碼,以確保a被裝入斧頭返回。我們必須達到一個明確的狀態。 –