說法 1:
局部變量是在程序運行時由棧分配,對於沒有初始化的局部變量,VC的DEBUG版會把未初始化的變量value,初始化為sizeof(value)個0xCC。所以我們會看到未初始化的整型的值始終是-858993460,而不是任意值。有意思的是漢字“燙”的編碼恰好就是1100110011001100,所以要是我們輸出一段字符串的值是一長串“燙”時,那么就要注意是否是字符串沒有被初始化引起的!
說法 2:
CPU不認識變量,更無法識別變量的名字,CPU只會從特定的內存位置取值或者將值存到特定的內存位置,因此當問一個變量的值是多少的時候,必須要知道這個變量對應的值被保存在什么地方。
a的值取決於調入內存該位置的頁面對應偏移的初始值,這取決於操作系統:
-
操作系統在分配給程序頁面時可能會將頁面clear為零頁。
打印結果,a的值為0,我們認為操作系統返回給了應用程序零頁。
結論:函數返回在pop出當前棧幀的時候,並不會清理它遺留在棧幀里的數據,下個函數調用再次重用到該棧幀的內存時,未初始化的局部變量將會被遺留數據影響,從而變得不確定!
