"燙燙燙屯屯屯" 那些事

在 Windows 上用 VC6 或者 VS 做過 CC++ 開發的人都見過這些個有點奇怪並且還略帶搞笑的字眼。

"燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙"

"屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯"

很多初學者雖然經常遇到,但是並不知道這是什麼梗。

其實 “燙” 和 “屯” 都是按照 GBK 編碼顯示的結果,對應的十六進制分別為 0xcccc, 0xcdcd 。

這是微軟 CC++ 編譯器在 debug 模式下,引入的一種內存保護機制,會給特定的內存賦一個特定的初值。

具體怎麼賦值,賦一個什麼值呢? 我來列舉一下常見的幾種。

1. 0XCC

未被初始化的棧內存,會被寫入 0XCC 。

例:

2. 0XCD

未被初始化的堆內存,會被寫入 0XCD

例:

這裡 d 的值為 0x00CA56B8, 可以看出,它指向的內存為cdcdcd...

64b0f3b1357580cc3fbbae608bcf2c05

這裡 e 的值為 0x00C45468, 可以看出,它指向的內存也為cdcdcd...

3. 0XFD

堆內存的周圍(前後各 4 個 Byte),會被寫入 0XFD

這個區域被稱為 “無人區”,寫入 0XFD, 相當於是加瞭 Fence,用於檢測數組越界。

還是前面的例子。

0abdf974d2d559fa6781ccdb6bd32986

4. 0XDD

被銷毀的堆內存,會被寫入 0XDD 。

例:

e292905dd956564605219ef28aefde6c

除瞭上面的這些,還有一些特定字符會被用到,如 0XBAADFOOD, 0XABABABAB, 0XFEEEFEEE, 0XDEADBEEF 等,因為不常出現,這裡就不細說瞭。

微軟之所以這麼做,除瞭內存保護,我想還為瞭調試方便,給它們一個確定的值而不是隨機值,這樣可以每次運行都是相同的結果。

說瞭這麼多,隻是想讓大傢理解編譯器的行為。當然,不同的編譯器,會有不同的行為,例如 gcc, 就不會給未初始化的變量賦初值,一切都是隨機的。

最後,提醒大傢

========題外話=========

附上大傢關心的段子吧。

手持兩把錕斤拷, (GBK與UTF-8)

口中疾呼燙燙燙。(VC++)

腳踏千朵屯屯屯, (VC++)

笑看萬物锘锘锘。(HTML)

(註:這個段子不是我造的,來源於 劉松泉 http://zhidao.baidu.com/question/2267040273698235148.html

我來解說一下,其實也隻有 燙燙燙 和 屯屯屯 是微軟編譯器搞出來的,錕斤拷 和 锘锘锘 實際上是編碼字符集轉換問題。

你把 錕斤拷 和 锘锘锘 也歸為微軟編譯器惹的禍?

微軟編譯器表示這個鍋我不背。

发表回复

相关推荐

罕见国企硕鼠,边贪三亿,边举报他人,被查吓哭:请求组织原谅

今天讲一个身居高位的国企总经理,享受副厅级待遇,却因为两大爱好,最后落了个被判死刑的可悲结果。说起他的这两个爱好,真 ...

· 15分钟前

【2023年双11更新】汽车贴膜选购攻略,哪些太阳膜值得买?最值得推荐的汽车贴膜!

我平时喜欢研究汽车用品,备胎已经被我扔到了床底下,我是 @广哥聊汽车,欢迎关注我,有问题欢迎留言讨论。

· 16分钟前

膽礬的化學式及知識點介紹

膽礬又稱五水合硫酸銅,膽礬的化學式,膽礬的功效和作用又是什麼瞭?下面來一起瞭解一下膽礬吧。1、膽礬的化學式化學式:CuSO4...

· 17分钟前

11人拯救整個世界 二戰著名特種作戰行動 重水之戰

11人拯救整個世界 二戰重水之戰http://www.icpchaxun.com/video/1049796177821855744這期我們來給大傢講述,戰地V 北極之光 ...

· 18分钟前

2023年(双11)4000元左右手机推荐/3500-4500/拍照旗舰手机/父母/学生/拍照/游戏/续航/性能好/性价比/小米/vivo/iQOO/华为/荣耀/OPPO/三星/真我

2023年11月7日新增 iQOO 12 2023年10月26日新增小米14 2023年10月24日更新双11活动价格 2023年10月8日更新机型价格 2023年5 ...

· 30分钟前