外國人程式設計出錯也會出現 燙燙燙燙 嗎?為什麼會出現這個?

時間 2021-05-11 14:14:56

1樓:葉劍飛

其實就是 Visual C++ 在 debug 模式下常用 0xCC 來填充未初始化的記憶體而已。

中國大陸地區常用 GBK 編碼,看到的是「燙燙燙燙」。

台灣地區常用 Big5 編碼,看到的就是「昍昍昍昍」。

美國常用 CP 850 (DOS Latin 1)編碼,看到的就是「╠╠╠╠」。

2樓:勝勳

理論上猜測如下:

1個漢字占用2個位元組,而且第乙個位元組必須是大於127的乙個數字也就是說,出現「燙燙燙燙」的那個程式使用了某個「大於127」的字元,被中文windows誤以為是漢字,就顯示出了漢字

據說「燙」字對應的2個位元組用16進製表示是「CCCC」

16進製制的「CC」 = 10進製的「204」,確實大於127,會在中文WINDOWS上顯示成漢字

3樓:眺望天下

安全編碼十年經驗,這個回答,應該算是專業了。

以字串的形式讀取了未初始化記憶體。

根據C語言國際標準,未初始化記憶體的值是「未定義」行為,即國際標準中沒有硬性規定這個值到底是多少,編譯器在實現過程中可以自由設定。

典型的申請乙個字元陣列,不對其進行任何賦值,就直接輸出,就有可能出現各種情況。

進而,因為沒有有效賦值,列印無法找到有效的終結符「\0」,會繼續將後續記憶體當做字串進行讀取。直到找到記憶體值為0的資料,或者讀取遇到不具有可讀取許可權的記憶體,造成程式執行錯誤,甚至崩潰。

進一步解釋,這個「燙」如果沒有記錯,應該是記憶體值「0xcccc」對應的漢字。這個其實是編譯器自身對未定義記憶體的乙個「自我初始化」的做法,至於說為什麼不設定成0,這個,純粹是人家開發人員樂意。當時,這樣的好處,是程式設計師不會對這個非零的值形成依賴,同時也可以在一定程度上幫助程式設計師定位錯誤。

而這個cccc,編碼行程的漢字,依照的是ANSI編碼,這個編碼,在不同地區,對應該地區本地語言是不同的(區別於unicode以及其各種壓縮格式的編碼)。因此這個編譯器自己鬧著玩說了算的值,不同編譯器是可能不同的,在不同地區,依照該地區的編碼解讀,也會不同。

4樓:金奇

從C語的角度看要是你STRLEN的對像沒有結束符那麼列印出來的數劇就是記憶體中隨意的資料.配合你輸出的編碼格式.UT8 GDK什麼的,可能就會有這輸出了.

5樓:浪浪的麥子

說起這個還得感謝燙燙燙燙

這學期C++考試有一道題怎麼做OJ都沒通過,結果執行一看輸出全是燙燙燙燙燙,瞬間知道自己陣列越界了。馬上改過來。於是C++滿分通過

6樓:靈劍

除錯模式下VS會給棧記憶體加上額外的保護段並且用0xCC填充,0xCC在x86下是INT 3指令,這個指令會觸發斷點,這樣偵錯程式就可以發現程式因為越界覆蓋了返回位址之類的各種各樣的原因執行到了堆疊資料裡面……

堆當中則會用0xCD來填充,也就是「屯屯屯屯屯」

屯和燙都是GBK編碼的結果,所以只有簡體中文Windows,而且程式鏈結了ANSI版本的API才會顯示這個。現代的程式可以選擇使用UTF-16的Unicode版本的庫,這種情況下會變成韓文。

如果是台灣(BIG-5)則會顯示「昍昍昍」,日本(Shift-JIS)應該會顯示「」

從Google搜尋的結果來看,這幾個字也是廣為世界人民困擾的魔咒

7樓:馬超

好問題。先回答為什麼會出現「燙燙燙」。

首先,這個現象只會在windows下用vs或者vc程式設計時才出現,並且只會出現在debug版本的執行過程中。如果在類unix系統下,使用gcc或者clang編譯器,你得到得通常會是提示segmentation fault.

vc或者vs在debug版本的程式初始化時,會將棧內未初始化的記憶體每個位元組設定成0xcc,這個代表的是乙個特殊的中斷機器碼,int 3,準確地說是軟體除錯中斷。注意,這裡的int是interrupt的意思,不是integer。將這些記憶體初始化成這個樣子是為了方便使用者進行斷點除錯。

然而,當你的程式出現了訪問未出初始化的棧記憶體時,例如,陣列越界,就會訪問這個特殊的位元組,如果你把它列印出來,通常會進行ascii碼的對映。可是,0xcc對應的十進位制是204,然而ascii碼的範圍是0~127啊!所以,對於乙個超過ascii碼表示範圍的字元,程式通常會嘗試使用unicode編碼,unicode編碼是16位的,所以0xcc會被擴充套件稱為0xcccc,我們驗證一下「燙」的unicode編碼值:

怎麼不對呢?別急,我們猜測,中文字元通常會使用gbk編碼,那麼「燙」的gbk編碼是什麼呢?我們查一下:

果然沒錯!原來字元按照gbk編碼解析了。

現在回答樓主的問題,外國程式設計師會不會出現「燙燙燙」。

1. 首先如果不是用windows,不是用vs或者vc那麼不會出現。

2. 如果不是debug模式,也不會出現。通常會是亂碼。

以上的條件決定了編譯器是否會用0xcc填充非初始化棧記憶體。

3. 如果以上條件都滿足,那麼能不能出現燙要看你的程式設計環境和作業系統是否支援gbk編碼集,然而,大多數的英文作業系統並不預設支援。所以很可能還是按照unicode的方式去翻譯。

後記:「燙燙燙燙」是每乙個在學校初學程式設計的學生都有的疑惑,代表了我們這些搞技術人青澀的過往,也是一段美好的回憶。貼張圖以表懷念。

外國人在初學中文時在閱讀時會出現分詞障礙嗎?

會的有一天周立波去劇院演出,看見很多人圍著牆看,走近發現是有人在牆上刷了 周立波小人傻 幾個大字。周立波臉都綠了,剛要發作,卻見乙個姑娘衝過來,聲淚俱下地大罵寫字的人。周立波很是欣慰,柔聲問道 小妹妹你叫什麼名字?姑娘抽泣著答 我叫 周 立。 Ovear 下雨天留客天留人不留 標點的力量 恩。以前是...

外國人也會裝逼嗎?

歪果仁研究協會 當歪果仁說這些的時候,八成在裝逼 歪果仁是怎麼裝嗶的? 夏天的秋天 非常會!例如1,和朋友一起喝酒,很普通的紅酒,房間裡已經有現成的高腳酒杯了,非不用。要讓客服拿杯子過來,拿過來一看,就是小一點的高腳杯嘛,那紅酒也不是什麼高階貨啊,還要特地配個杯子,裝逼。例2,和朋友握手,非要換個手...

外國人是不是也背誦乘法口訣?

西班牙小孩要背的。不過很有意思,他們的乘法表不是九九乘法表,應該說是十十乘法。我們的乘法表是不一樣長的,比如第一行從1 1背到1 9,第二行就從2 2開始,因為2 1已經在1 2時背過了,結果反正都一樣。這樣我們需要背的就是9 8 7 6 5 4 3 2 1 45句。但西班牙不是。他們要背100句,...