有趣的“燙燙燙燙”和“屯屯屯屯”


 

相信在VC下調試過代碼的同學都遇到過這種情況,想看一個字符串的值,結果發現顯示的是一串長長的” 燙燙燙燙燙燙燙燙”或“屯屯屯屯屯屯屯屯屯屯屯”,囧!

在Visual Studio中的Debug模式下,如果聲明一個變量,但是沒有初始化,微軟會給未初始化的內存復制為0xCC。給為初始化的內存賦0xCC是有原因的,0xCC其實是INT3中斷指令,所以如果在Debug模式下試圖去執行這塊未初始化的內存的話就會中斷程序。

演示代碼:

代碼

內存:

這里出現的”燙”其實是因為VS中調試器默認的字符集是MBCS,而在MBCS中0xCCCC正好就是中文中的”燙”,所以就出現了我們熟悉的燙內存!

至於“屯”,是因為如果在堆中分配的內存,即用new 命令分配的,默認的值是0xCD。而0xCDCD在MBCS字符集里正好是“屯”。

上面那個棧內存中,除了我們分配的四個char(紅色框出),還有另外幾個0xCC,這些地址也是微軟為我們自動填充的,主要目的也是為了防止一些越界的情況,可以讓程序員在Debug模式下能夠發現一些Release時會碰到的錯誤。這個內存填充在Release模式下是不會有的!

P.S. 不知道外國佬調試的時候看到這些中文是什么感受,哈哈哈哈!

P.S.S. 經過在英文操作系統以及英文的Visual Sutdio下測試,外國人可能不能看到偉大的中文了,因為他們電腦上很可能沒有安裝MBCS字符集或者說是他們的VS不會默認以MBCS來解析字符串。


免責聲明!

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



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