C語言靜態變數初始化問題

2021-08-15 13:33:07 字數 978 閱讀 4355

以前在學習c語言中,看到了這麼一行**:

static

int arr[100];

這是一行很正常的**,但是我「細心」的發現作者在使用它的時候並沒有初始化。書上的解釋是,用static修飾的變數會自動初始化。

為什麼會被初始化呢?首先我們看一段話:

可執行程式和記憶體映像的區別在於:可執行程式位於磁碟上,記憶體映像位於記憶體中,可執行程式沒有堆疊,可執行程式雖然也有未初始化的資料段,但是它並不儲存在位於硬碟中的可執行檔案中:

我們用兩個程式來檢驗一下這段話是否正確

// withbss.c 未初始化的程式

double a[10000];

int main(void)

// withoutbss 已初始化的程式

通過兩個可執行檔案的對比,我們發現少了大概80000(sizeof(double)×10000)個位元組。那麼宣告的陣列去哪兒了?其實static 變數只完成一次初始化,這個任務是由」鏈結器」完成的,在程式執行之前,它會將合適的值給變數, 如果沒有初始化值, 則系統會假定認為它們的值為0,並會分配一塊空間(bss,存放程式中未初始化的全域性變數的一塊記憶體)來存放這些未初始化的變數,而這塊空間也會全部被清空為0。

bss在哪兒,它是在程式的記憶體空間中還是系統提供的空間?

由圖我們可以得知,bss是在程式的記憶體空間中。

靜態變數初始化順序

1.begin a a a a,from a的物件 a a,a.num01 0 a a,b.num02 0 a a,b.instance a null end a a begin a a a a,from a的物件 a a,a.num01 1 a a,b.num02 1 a a,b.instance...

final非靜態變數初始化

size medium final變數可以在任何可以被始化的地方被始化,具體應該是建構函式之前或建構函式中,但只能被初始化一次.一旦被初始化後就不能再次賦 值 重新指向其它物件 作為成員變數一定要顯式初始化,而作為臨時變數則可以只定義不初始化 當然也不能引用 即使是作為乙個類中的成員變數,也還可以在...

Java靜態變數初始化的坑

如圖所示的 class singleton public static singleton getinstance public class test 如圖所示的 執行之後的結果為 count 1 count 1 而這和我們想象中的兩個值分別為1,2不一樣,這是因為在test中呼叫getinstan...