為什麼在C語言中靜態變數的初值是0?

時間 2021-05-31 13:44:23

1樓:gkmail

未初始化的靜態變數一般是分配在BSS段.程式載入時會對整個BSS段進行清0操作,因此這些靜態變數的初始值是0.

而臨時變數是分配在堆疊裡的,在進入函式時,並不會對函式使用的堆疊進行初始化操作,因此堆疊內的未初始化的臨時變數值是不確定的.

2樓:zephyr z

對於變數

靜態和全域性只是作用域不同在儲存空間上都一樣的如果不初始化或者初始值為零那麼在很多系統上並不會占用映像檔案的空間,可以節約檔案大小(詳見 BSS)

在很多系統上執行的時候這些資料一開始都被對映到乙個特殊的唯讀頁面其值為全零

當第一次遇到寫操作的時候系統為全分配乙個可寫的頁面稱為 copy on write

3樓:進製資料

在C語言中,全域性變數和區域性靜態變數都是儲存在靜態儲存區的,在分配的時候都被系統預設初始化為0;而區域性自動變數是在棧上分配記憶體,如果不進行初始化,那麼他們可能是隨機值。

4樓:靈劍

不同的記憶體區域在程式執行時特性是不同,大致分為靜態空間、棧空間、堆空間。靜態空間其實是跟著程式映像一起載入到記憶體裡的,提前就寫在映像裡了,無論如何會有個初始值,反正寫啥都是寫,不如寫0;而棧空間和堆空間是映像載入完之後系統分配的,為了提高效率系統不會主動替你清零,C也不會,所以未初始化的變數是記憶體裡原有的值。

所謂映像就是可執行程式的檔案。所以實際上用十六進製制編輯器編輯映像就可以修改一些靜態變數的初始值,以前有一些程式依據這個原理可以將一些資料儲存到自己的映像裡面,不依賴外部檔案,不過現在這麼設計的程式已經很少了。

5樓:Pluto Hades

簡單來說,原因是效率。

全域性和靜態變數是在編譯期就確定了位址和值,並不消耗執行時的時間。

區域性變數是在每次函式呼叫時才在棧上產生,你可以自行選擇是否初始化。

C語言中,對指標變數取位址得到什麼?

已登出 求仁得仁,取位址得位址。C語言裡面,一切變數都是跟澡堂子的那種小箱子一樣,而位址就是鑰匙。取位址就是拿到這個箱子的鑰匙。至於箱子裡面裝什麼,也可以是衣服,也可以是另乙個箱子的鑰匙。有一種很蛋疼的做法,就是從第一箱子裡面拿鑰匙開第二個箱子,從第二箱子裡面拿鑰匙開第三個箱子,可以以此類推。 凍椰...

C語言中連續定義兩個變數,為什麼位址是這樣的?

以下程式在VS2015和VS6.0的執行結果分別如圖 include int main 以下程式可檢測CPU是big endian還是little endian bool IsBigEndian cout false return false 然而並無卵用。VS2015依然是從小到大。 題主自己動手...

c語言中,形參就是變數嗎?為什麼說函式的形參可以是指標型別?

C語言答疑課堂 別說形參了,實參也是變數,傳遞給函式的引數都是變數。指標也是一種變數,跟int變數,char變數一樣,都是變數。既然都是變數,函式大爺全然接受。 形參就是函式的引數 什麼是引數?比如你在dos下敲個命令dir如果目錄太多的話一螢幕顯示不完。那麼敲 dir p就可以分屏顯示,這個 p就...