在 Windows 上用 VC6 或者 VS 做過 CC++ 開發的人都見過這些個有點奇怪並且還略帶搞笑的字眼。
"燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙"
"屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯"
很多初學者雖然經常遇到,但是並不知道這是什麼梗。
其實 “燙” 和 “屯” 都是按照 GBK 編碼顯示的結果,對應的十六進制分別為 0xcccc, 0xcdcd 。
這是微軟 CC++ 編譯器在 debug 模式下,引入的一種內存保護機制,會給特定的內存賦一個特定的初值。
具體怎麼賦值,賦一個什麼值呢? 我來列舉一下常見的幾種。
未被初始化的棧內存,會被寫入 0XCC 。
例:
未被初始化的堆內存,會被寫入 0XCD
例:
這裡 d 的值為 0x00CA56B8, 可以看出,它指向的內存為cdcdcd...
64b0f3b1357580cc3fbbae608bcf2c05
這裡 e 的值為 0x00C45468, 可以看出,它指向的內存也為cdcdcd...
堆內存的周圍(前後各 4 個 Byte),會被寫入 0XFD
這個區域被稱為 “無人區”,寫入 0XFD, 相當於是加瞭 Fence,用於檢測數組越界。
還是前面的例子。
0abdf974d2d559fa6781ccdb6bd32986
被銷毀的堆內存,會被寫入 0XDD 。
例:
e292905dd956564605219ef28aefde6c
除瞭上面的這些,還有一些特定字符會被用到,如 0XBAADFOOD, 0XABABABAB, 0XFEEEFEEE, 0XDEADBEEF 等,因為不常出現,這裡就不細說瞭。
微軟之所以這麼做,除瞭內存保護,我想還為瞭調試方便,給它們一個確定的值而不是隨機值,這樣可以每次運行都是相同的結果。
說瞭這麼多,隻是想讓大傢理解編譯器的行為。當然,不同的編譯器,會有不同的行為,例如 gcc, 就不會給未初始化的變量賦初值,一切都是隨機的。
最後,提醒大傢
========題外話=========
附上大傢關心的段子吧。
手持兩把錕斤拷, (GBK與UTF-8)
口中疾呼燙燙燙。(VC++)
腳踏千朵屯屯屯, (VC++)
笑看萬物锘锘锘。(HTML)
(註:這個段子不是我造的,來源於 劉松泉 http://zhidao.baidu.com/question/2267040273698235148.html)
我來解說一下,其實也隻有 燙燙燙 和 屯屯屯 是微軟編譯器搞出來的,錕斤拷 和 锘锘锘 實際上是編碼字符集轉換問題。
你把 錕斤拷 和 锘锘锘 也歸為微軟編譯器惹的禍?
微軟編譯器表示這個鍋我不背。
今天讲一个身居高位的国企总经理,享受副厅级待遇,却因为两大爱好,最后落了个被判死刑的可悲结果。说起他的这两个爱好,真 ...
我平时喜欢研究汽车用品,备胎已经被我扔到了床底下,我是 @广哥聊汽车,欢迎关注我,有问题欢迎留言讨论。
11人拯救整個世界 二戰重水之戰http://www.icpchaxun.com/video/1049796177821855744這期我們來給大傢講述,戰地V 北極之光 ...
2023年11月7日新增 iQOO 12 2023年10月26日新增小米14 2023年10月24日更新双11活动价格 2023年10月8日更新机型价格 2023年5 ...