简单说明
出现“烫”的原因是由于字符数组中的某些数组元素没赋值。
具体原因可以通过如下实例来进行说明:
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
printf("%s", a); // 输出结果就会出现很多“烫”,因为只对数组a中前四个元素进行了赋值,后面的元素未进行赋值,所以计算机默认就输出“烫”
如果作如下修改就会正常输出
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
a[4] = '\0';
printf("%s", a); // 输出abcd,因为加了结束字符'\0',而C语言中输出字符串是以结束字符'\0'作为结束输出的,所以只输出'\0'前面的所以字符,即abcd
深入分析
这种乱码最常见的地方是Visual Studio里。Visual Studio中,未初始化的栈空间用0xCC填充,而未初始化的堆空间用0xCD填充。而0xCCCC和0xCDCD在中文GB2312编码中分别对应“烫”字和“屯”字。如果一个字符串没有结束符’\0’,输出时就会打印出未初始化的栈或堆空间的内容
目的
这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误