2011-07-21 76 views
2

我們說,全局變量和靜態變量總是初始化爲0,然後我的問題是,爲什麼我們在初始化和未初始化的數據的二進制獨立的部分。操作系統,C和進程的內存分配

我寫了下面的代碼 -

int i; 
int j=0; 
static int k; 
static int l=0; 

int main() 
{ 
    static int m=0; 
    static int n; 
    printf("%d, %d\n",i,j); 
    printf("%d, %d\n",k,l); 
    printf("%d, %d\n",m,n); 
    return 0; 
} 

輸出功率爲 -

0, 0 
0, 0 
0, 0 

我檢查BSS部分的objdump的輸出,僅這一節包含的變量。但按照鏈接 -

http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

通常,在每個過程中,可用於該 進程的虛擬內存被稱爲其地址空間。每個進程的地址空間被 通常被組織在在下一 圖片6個所示部分:環境部 - 用於存儲環境變量和 命令行參數;該堆棧用於存儲參數,返回值和自動變量的功能 ;用於動態分配的堆(遊離 店),兩個數據部分(用於初始化 和未初始化的靜態和全局變量),並且其中的實際代碼被保持在一個文本部分 。

所以,我只是困惑。如果我們有兩個數據段,爲什麼所有的數據都放在.bss段。而且我想了解.data包含的內容。

是否有人可以幫助我在此?

+0

的'.bss'部分「存儲」在二進制作爲長度(和節頭);它不需要明確地存儲零。對於具有非零元素的結構,初始化值存儲在'.data'節中。在許多現代編譯器中,常量字符串存儲在'.text'節中,儘管傳統上它們是非常量並存儲在'.data'節中。這需要一個相當古老的'傳統'定義,但在C89標準之前,C編譯器通常不支持只讀常量字符串。 –

回答

5

.data部分通常爲編譯時已知值的變量或常量內存塊的較大塊(如編譯時已知的字符串和靜態數組塊)預留。另外,.bss節存儲未初始化或零值的變量,因爲在.data節中存儲零值沒有多大意義。

+0

所以基本上這意味着即使我用0初始化一個全局變量,它也存儲在.bss中。我證實了這一點,一旦我用一些其他值將變量初始化,它將被移到.data中。感謝您的回覆。 –

+0

是的,如果在.data中有一些元數據只有一堆0個塊佔用空間,那將會有點奇怪。 –