我們在剛學c程式設計的時候經常碰到「燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙」,這是為什麼呢?
先從上次某公司筆試說起,當時有一題是考到了關於變數初始化的問題。在主函式外面(全域性)和裡面(區域性)個定義乙個int型別數值。然後沒有賦值,直接列印出來,問輸出什麼。那會只知道全域性預設是0,區域性是乙個負的挺大的數,還以為是最小整數。回來後試了下,區域性的int預設的是-858993460,即0xcccccccc。
但是為什麼區域性的預設是0xcccccccc而不是其他的?
查了一些資料,發現vc的debug版會把未初始化的指標自動初始化為0xcccccccc,而不是就讓它隨機去,那是因為debug版的目的是為了能讓程式設計師更早的發現錯誤,把堆疊上的資料對初始化成了0xcc,也就是說區域性變數如果不初始化,那麼debug版本中就會是0xcc,如果野指標的初值不確定。而漢字「燙」的編碼恰好就是1100110011001100,這也就為什麼初學的時候會出現「燙」了,因為那會經常會忘記賦值或者陣列越界了。而全域性變數鏈結時已分配空間,程式執行時,作業系統的載入器,負責把鏈結器分配給全域性變數的虛擬記憶體空間,對映到乙個初始化為零的頁面,所以被初始化為零。全域性和靜態的預設初始化都是靠載入機制實現的。另外:未初始化的符號在目標檔案的bss段中,而初始化的符號在data段中。
區域性變數存在於(棧)中,全域性變數存在於(靜態區)中,動態申請資料存在於(堆)中。
關於C語言中的未初始化變數的值
我們在剛學c程式設計的時候經常碰到 燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙 這是為什麼呢?先從上次某公司筆試說起,當時有一題是考到了關於變數初始化的問題。在主函式外面 全域性 和裡面 區域性 個定義乙個int型別數值。然後沒有賦值,直接列印出來,問輸出什麼。那會只知道全域性預設是0...
c語言中全域性變數的初始化
c語言中區域性變數可以用型別相符的任意表示式來初始化,而全域性變數只能用常量表示式初始化,尤其對於全域性變數來說,不能用乙個數學函式或者其他的需要在執行時才能計算出結果的表示式進行初始化。因為程式開始執行時要用適當的值來初始化全域性變數,所以初始值必須儲存在編譯生成的可執行檔案中,因此初始值在編譯時...
關於未初始化全域性變數
前幾天發現未初始化全域性變數一些特性,後來在一篇部落格上發現有人說過這個問題 這是原博文位址 blog.csdn.net liuqiaoyu080512 article details 8455652 然後結合原博文,自己又做了幾個實驗 以下算是自己實驗一遍以後的總結 首先,自己曾經以為未初化的全域...