C++ 未被初始化的局部變量


說法 1: 

局部變量是在程序運行時由棧分配,對於沒有初始化的局部變量,VC的DEBUG版會把未初始化的變量value,初始化為sizeof(value)個0xCC。所以我們會看到未初始化的整型的值始終是-858993460,而不是任意值。有意思的是漢字“燙”的編碼恰好就是1100110011001100,所以要是我們輸出一段字符串的值是一長串“燙”時,那么就要注意是否是字符串沒有被初始化引起的!

 

說法 2: 

CPU不認識變量,更無法識別變量的名字,CPU只會從特定的內存位置取值或者將值存到特定的內存位置,因此當問一個變量的值是多少的時候,必須要知道這個變量對應的值被保存在什么地方。

a的值取決於調入內存該位置的頁面對應偏移的初始值,這取決於操作系統:
  • 操作系統在分配給程序頁面時可能會將頁面clear為零頁。

打印結果,a的值為0,我們認為操作系統返回給了應用程序零頁。

結論:函數返回在pop出當前棧幀的時候,並不會清理它遺留在棧幀里的數據,下個函數調用再次重用到該棧幀的內存時,未初始化的局部變量將會被遺留數據影響,從而變得不確定!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM