1. 程式人生 > >區域性變數和全域性變數的初始化

區域性變數和全域性變數的初始化

寫程式碼的時候遇到了這個問題,選兩段抄過來做個筆記。

定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的區域性變數定義時如果不顯式初始化,值就是髒的。

在C語言裡,全域性變數如果不初始化的話,預設為0,也就是說在全域性空間裡:int x =0; 跟 int x; 的效果看起來是一樣的。但其實這裡面的差別很大,強烈建議大家所有的全域性變數都要初始化,他們的主要差別如下:

  編譯器在編譯的時候針對這兩種情況會產生兩種符號放在目標檔案的符號表中,對於初始化的,叫強符號,未初始化的,叫弱符號。聯結器在連線目標檔案的時候,如果遇到兩個重名符號,會有以下處理規則:

  1、如果有多個重名的強符號,則報錯。

  2、如果有一個強符號,多個弱符號,則以強符號為準。

  3、如果沒有強符號,但有多個重名的弱符號,則任選一個弱符號。

所以不管是寫全域性變數還是區域性變數,最好都初始化一下。