回覆列表
  • 1 # 使用者2161839608847

    好問題。先回答為什麼會出現“燙燙燙”。首先,這個現象只會在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的方式去翻譯。後記:“燙燙燙燙”是每一個在學校初學程式設計的學生都有的疑惑,代表了我們這些搞技術人青澀的過往,也是一段美好的回憶。貼張圖以表懷念。

  • 中秋節和大豐收的關聯?
  • 如何讓嬰兒一次吃飽睡長覺?