相信在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來解析字符串。