1. 程式人生 > >C語言中的未初始化變數的值

C語言中的未初始化變數的值

C語言中未初始化的變數的值是0麼

全域性變數 、靜態變數初始值為0
區域性變數,自動變數初始值隨機分配
C語言中,定義區域性變數時如果未初始化,則值是隨機的,為什麼?
定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的區域性變數定義時如果不顯式初始化,值就是髒的。

參考:http://blog.csdn.net/robert_wzf/article/details/52462923

轉自:http://blog.csdn.net/robert_wzf/article/details/52462923

我們在剛學C程式設計的時候經常碰到“燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙”,這是為什麼呢?
先從上次某公司筆試說起,當時有一題是考到了關於變數初始化的問題。在主函式外面(全域性)和裡面(區域性)個定義一個int型別數值。然後沒有賦值,直接打印出來,問輸出什麼。那會只知道全域性預設是0,區域性是一個負的挺大的數,還以為是最小整數。回來後試了下,區域性的int預設的是-858993460,即0xcccccccc。
但是為什麼區域性的預設是0xcccccccc而不是其他的?
查了一些資料,發現VC的DEBUG版會把未初始化的指標自動初始化為0xCCCCCCCC,而不是就讓它隨機去,那是因為DEBUG版的目的是為了能讓程式設計師更早的發現錯誤,把堆疊上的資料對初始化成了0xcc,也就是說區域性變數如果不初始化,那麼DEBUG版本中就會是0xCC,如果野指標的初值不確定。而漢字“燙”的編碼恰好就是1100110011001100,這也就為什麼初學的時候會出現“燙”了,因為那會經常會忘記賦值或者陣列越界了。而全域性變數連結時已分配空間,程式執行時,作業系統的載入器,負責把連結器分配給全域性變數的虛擬記憶體空間,對映到一個初始化為零的頁面,所以被初始化為零。全域性和靜態的預設初始化都是靠載入機制實現的。另外:未初始化的符號在目標檔案的bss段中,而初始化的符號在data段中。


區域性變數存在於(堆疊)中,全域性變數存在於(靜態區)中,動態申請資料存在於(堆)中。