當初學習C語言時,對于一些特殊的打印輸出可能會感到困惑,比如會出現一堆亂碼燙燙燙的情況。其實這是因為在C語言中,對于字符類型和數字類型之間的隱式轉換可能會導致打印輸出的結果不符合預期。這并不意味著程序員"燙",而是因為數據類型轉換導致的打印錯誤。在編程過程中,對于數據類型的處理需謹慎,避免出現這種問題。希望這能幫助解答你的疑惑。
就比如這個代碼
#include<stdio.h>int main()
{char ch[] = { 'a','b','c' };printf("%s", ch);return 0;
}
很簡單的一個代碼,如果剛開始學,我們可能會覺得會打印abc;
但是學的比較深的同學就會里面反應過來這個代碼其實是有問題的,因為在字符數組里面,最后一位沒有存儲''\0'',所以在打印的時候不會遇見特殊結束標識符,不會停止打印;
那么當我們運行代碼,看看打印效果
果真會出現了燙燙燙燙燙。
對應打印其實是打印內存存儲的數據,那么我們對應的就需要查找內存出書信息,
還有一點如果運行多次會發現每一次的打印都是不一樣的。這個問題是跟結束條件’‘\0''有關;
首先我們先解決為什么每次打印我們看到結果不一樣問題:正如上圖所示我們看到后面恰好有初始化為0的地方,所以打印到對應的哪里,然而每次初始化又有可能不同,自然就會結束 所以每次打印結果可能不同;
那么我們再來解決為什么打印燙燙燙燙燙,在Visual Studio中,未初始化的棧空間用0xCC填充,而未初始化的堆空間用0xCD填充。因為abc是存儲在棧中,所以后面的內存中,內存會初始化為cc。而0xCCCC和0xCDCD在中文GB2312編碼中分別對應“燙”字和“屯”字。如果一個字符串沒有結束符’\0’,輸出時就會打印出未初始化的棧或堆空間的內容
?
這樣設計的目的:
這樣做的好處是這些值都很大,作為指針是不可能的(而且 32 位系統中指針很少是奇數值,在有些系統中奇數的指針會產生運行時錯誤),作為數值也很少遇到,而且這些值也很容易辨認,因此這很有利于在 Debug 版中發現 Release 版才會遇到的錯誤
對于本代碼如何修改避免:直接添加結束表示符
其實有一些文檔打開是亂碼跟這個道理差不多,只是沒有用二進制讀取方式打開;并不是文件本身有問題~~~