屯屯交朋友怎麼樣?在 Windows 上用 VC6 或者 VS 做過 C\C 開發的人都見過這些個有點奇怪并且還略帶搞笑的字眼,接下來我們就來聊聊關于屯屯交朋友怎麼樣?以下内容大家不妨參考一二希望能幫到您!
在 Windows 上用 VC6 或者 VS 做過 C\C 開發的人都見過這些個有點奇怪并且還略帶搞笑的字眼。
"燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙"
"屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯"
很多初學者雖然經常遇到,但是并不知道這是什麼梗。
其實 “燙” 和 “屯” 都是按照 GBK 編碼顯示的結果,對應的十六進制分别為 0xcccc, 0xcdcd 。
這是微軟 C\C 編譯器在 debug 模式下,引入的一種内存保護機制,會給特定的内存賦一個特定的初值。
具體怎麼賦值,賦一個什麼值呢? 我來列舉一下常見的幾種。
1. 0XCC未被初始化的棧内存,會被寫入 0XCC 。
例:
2. 0XCD未被初始化的堆内存,會被寫入 0XCD
例:
這裡 d 的值為 0x00CA56B8, 可以看出,它指向的内存為cdcdcd...
這裡 e 的值為 0x00C45468, 可以看出,它指向的内存也為cdcdcd...
3. 0XFD堆内存的周圍(前後各 4 個 Byte),會被寫入 0XFD
這個區域被稱為 “無人區”,寫入 0XFD, 相當于是加了 Fence,用于檢測數組越界。
還是前面的例子。
4. 0XDD被銷毀的堆内存,會被寫入 0XDD 。
除了上面的這些,還有一些特定字符會被用到,如 0XBAADFOOD, 0XABABABAB, 0XFEEEFEEE, 0XDEADBEEF 等,因為不常出現,這裡就不細說了。
微軟之所以這麼做,除了内存保護,我想還為了調試方便,給它們一個确定的值而不是随機值,這樣可以每次運行都是相同的結果。
說了這麼多,隻是想讓大家理解編譯器的行為。
當然,不同的編譯器,會有不同的行為,例如 gcc, 就不會給未初始化的變量賦初值,一切都是随機的。
最後,提醒大家
一定不要忘記初始化變量
new\delete, malloc\free 配套使用
delete\free 之後,要讓指針為 null
警惕數組越界
避免野指針
========題外話=========
附上大家關心的段子吧。
手持兩把锟斤拷, (GBK與UTF-8)
口中疾呼燙燙燙。(VC )
腳踏千朵屯屯屯, (VC )
笑看萬物锘锘锘。(HTML)
我來解說一下,其實也隻有 燙燙燙和 屯屯屯是微軟編譯器搞出來的,锟斤拷和 锘锘锘 實際上是編碼字符集轉換問題。
你把 锟斤拷和 锘锘锘 也歸為微軟編譯器惹的禍?
微軟編譯器表示這個鍋我不背。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!