相信這個(gè)標(biāo)題,有十個(gè)人看,就有十個(gè)人搞不懂什么意思。

 

燙燙燙燙燙燙!

 

只有程序員才有可能點(diǎn)點(diǎn)頭,然后會心一笑。

 

似乎這是程序員才懂的某種黑話。

 

 

 

知乎上有個(gè)這樣的問題:“用一句話證明自己是程序員?”

 

燙燙燙燙燙燙!

 

“燙燙燙燙燙燙”

 

簡單幾行字,高贊上榜。

 

燙燙燙燙燙燙!

 

但是,這個(gè)“燙燙燙燙燙燙”到底是個(gè)啥意思?

 

莫非是程序?qū)L燙的CPU發(fā)出的控訴?

 

其實(shí),答案非常簡單——亂碼

 

燙燙燙燙燙燙!

 

道理我都懂,但為什么亂碼偏偏是這串有點(diǎn)好笑的“燙燙燙燙燙燙”呢?

 

 

那就要從這段程序到底經(jīng)歷了什么開始講起了。

 

Visual Studio的編譯器分配完空間后,會順手往里面裝進(jìn)去一點(diǎn)內(nèi)容。默認(rèn)裝進(jìn)去的東西也有幾種差別:

 

①未分配或靜態(tài)分配但未賦初值的內(nèi)存空間,初值用0xCCCC填充;

②動態(tài)分配但未賦初值的內(nèi)存空間,初值用0xCDCD填充;

③動態(tài)分配后又被回收了的內(nèi)存空間,用0xDDDD填充;

 

正常情況下,這些內(nèi)容是不會被訪問到的。當(dāng)然,這是正常情況。

 

當(dāng)發(fā)生一些bug,如非常常見的數(shù)組越界的時(shí)候,事情就發(fā)生了。

 

因?yàn)閎ug,剛好以字符輸出了情況①的填充內(nèi)容,我們就會看到華麗而壯觀的……

 

燙燙燙燙燙燙!

 

我們知道,在中國,VS輸出漢字用的是GBK編碼。

 

是的,0xCCCC就是“燙”的GBK編碼

 

順帶一提,0xCDCD對應(yīng)的是漢字“屯”,而0xDDDD對應(yīng)的是漢字“葺”

 

這個(gè)bug實(shí)在是太常見了,“燙燙燙燙燙燙”也就順勢走紅,甚至被當(dāng)成了黑話。

 

不過,這個(gè)bug不是每次都會以這個(gè)滑稽又有點(diǎn)可愛的形式出現(xiàn)。

 

燙燙燙燙燙燙!

 

只有在按字符輸出的情況下才能看到這些。

 

按int輸出的話,看到的,只有索然無味的

 

-858993460(0xCCCCCCCC)

-842150451(0xCDCDCDCD)

-572662307(0xDDDDDDDD)

 

GBK編碼確實(shí)為中國程序員帶來了很多意想不到的麻煩。但也為大家?guī)砹撕芏嗄涿畹臍g樂。

 

比如名聲更大的神秘東方武器“錕斤拷”

 

感興趣的小伙伴們可以自己查一查哦~