考據 「燙燙燙」與「錕斤拷」的原理

2021-06-29 05:57:29 字數 587 閱讀 6349

在程式設計師**上經常看到乙個段子(滿滿的都是淚啊)

手持兩把錕斤拷,口中疾呼燙燙燙。

解釋一下為什麼會是這兩個東西不是別的= =:

棍斤拷亂碼:

源於gbk字符集和unicode字符集之間的轉換問題。

unicode和老編碼體系的轉化過程中,肯定有一些字,用unicode是沒法表示的,unicode官方用了乙個佔位符來表示這些文字,這就是:u+fffd replacement character。

那麼u+fffd的utf-8編碼出來,恰好是 '\xef\xbf\xbd'。如果這個'\xef\xbf\xbd',重複多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',然後放到gbk/cp936/gb2312/gb18030的環境中顯示的話,乙個漢字2個位元組,最終的結果就是:錕斤拷——錕(0xefbf),斤(0xbdef),拷(0xbfbd)。

燙燙燙亂碼:

在windows平台下,ms的編譯器(也就是vc帶的那個)在 debug 模式下,會把未初始化的棧記憶體全部填成 0xcc,用字串來看就是"燙燙燙燙燙燙燙",未初始化的堆記憶體全部填成0xcd,字串看就是「屯屯屯屯屯屯屯屯」。也就是說出現了燙燙燙,趕緊檢查初始化吧。。。

Debug時,記憶體裡怎麼都是「燙燙燙燙燙燙」

在 debug 模式下會自動加上 gz 編譯選項,它可以幫助捕獲記憶體錯誤。gz 選項會做以下這些事 1 初始化記憶體和變數。包括用 0xcc 初始化所有自動變數,0xcd cleared data 初始化堆中分配的記憶體 即動態分配的記憶體,例如 new 0xdd dead data 填充已被釋放...

有趣的「燙燙燙燙」和「屯屯屯屯」

相信在vc下除錯過 的同學都遇到過這種情況,想看乙個字串的值,結果發現顯示的是一串長長的 燙燙燙燙燙燙燙燙 或 屯屯屯屯屯屯屯屯屯屯屯 囧!在visual studio中的debug模式下,如果宣告乙個變數,但是沒有初始化,微軟會給未初始化的記憶體複製為0xcc。給為初始化的記憶體賦0xcc是有原因...

燙燙燙」和「屯屯屯」

在c語言中,變數在宣告時,並不會對變數對應記憶體區域進行清理操作。此時,變數值可能是完全不可預期的結果。開發者需要習慣在使用c語言進行宣告時要初始化操作,稍有不慎,就會造成不可預知的後果。在網路上只有程式設計師才能看懂的 燙燙燙 和 屯屯屯 的梗,就 於c c 中變數預設不初始化。微軟的 vc 編譯...