全局變量 、靜態變量初始值為0C語言中,定義局部變量時如果未初始化,則值是隨機的,為什么?
局部變量,自動變量初始值隨機分配
定義局部變量,其實就是在棧中通過移動棧指針來給程序提供一個內存空間和這個局部變量名綁定。因為這段內存空間在棧上,而棧內存是反復使用的(臟的,上次用完沒清零的),所以說使用棧來實現的局部變量定義時如果不顯式初始化,值就是臟的。
參考: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段中。
局部變量存在於(堆棧)中,全局變量存在於(靜態區)中,動態申請數據存在於(堆)中。
