為什麼要把bss段清0
阿新 • • 發佈:2019-01-08
全域性變數與靜態變數沒有初始化或初始化值為0時,都會放在.bss段。初始化為非0值,則放在.data段。
全域性變數與靜態變數沒有初始化或初始化值為0時,都放在.bss段會產生一個問題:假如說我們定義一個全域性的變數 int a = 0;我們知道這是一個初始化值為0 的全域性變數,那麼他會被放在.bss段,由於儲存在bss段內的資料在下一次啟動程式碼時不會被自動的重新初始化為0(即bss段清0),這就可能導致上一次執行程式碼過程中有可能修改了全域性變數或靜態變數的值,而修改過的值會被bss段儲存下來,那麼在下一次啟動程式碼事我們定義的那個全域性變數的值就可能不是我們第一次定義的
“0”值了,這樣的話就有可能導致一些問題。
舉個例子:
int a = 0//全域性變數,被放在bss段
void main(void)
{
if(a == 0){
printf("a=0");
a = 1;
}
else{
printf("a != 0 ");
a = 0;
}
}
我們第一次執行程式時,是輸出:a = 0,第二次再執行就輸出:a != 0了,下一次再執行 又輸出:a = 0 了,這樣就導致同樣的程式碼,在不同次的執行是產生不同的結果,這絕不是我們希望看到的。所以在初始化程式碼是我們要對bss段清0。這樣每次執行是為初始化的全域性變數、靜態變數和初始化為0的全域性變數、靜態變數就預設全是0了,這樣就不會導致上面例子中的那種情況。
如何對Bss段清零?在連結指令碼中標記bss段的開始和結束位置,然後在初始化程式碼的時候把開始標記和結束標記之間的內容清0。