相信在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來解析字串。
燙燙燙」和「屯屯屯」
在c語言中,變數在宣告時,並不會對變數對應記憶體區域進行清理操作。此時,變數值可能是完全不可預期的結果。開發者需要習慣在使用c語言進行宣告時要初始化操作,稍有不慎,就會造成不可預知的後果。在網路上只有程式設計師才能看懂的 燙燙燙 和 屯屯屯 的梗,就 於c c 中變數預設不初始化。微軟的 vc 編譯...
經典亂碼「燙燙燙」和「屯屯屯」
經典亂碼 燙燙燙 和 屯屯屯 程式猿有個經典的內部笑話 手持兩把錕斤拷,口中疾呼燙燙燙。燙燙燙和屯屯屯產生自vc,這是debug模式下vc對記憶體的初始化操作。vc會把棧中新分配的記憶體初始化為0xcc,而把堆中新分配的記憶體初始化為0xcd。0xcc恰好是終端指令int 3,算是保護嗎?把0xcc...
考據 「燙燙燙」與「錕斤拷」的原理
在程式設計師 上經常看到乙個段子 滿滿的都是淚啊 手持兩把錕斤拷,口中疾呼燙燙燙。解釋一下為什麼會是這兩個東西不是別的 棍斤拷亂碼 源於gbk字符集和unicode字符集之間的轉換問題。unicode和老編碼體系的轉化過程中,肯定有一些字,用unicode是沒法表示的,unicode官方用了乙個佔位...