控制台中,为什么会打印出烫烫烫?--那些中文乱码问题【more cpp-8】
无内鬼,来点CPP笑话
今天讲讲烫烫烫这个问题
问题引入
在我们写出BUG并且打印字符串的时候,常常会遇到控制台中打印出烫烫烫的情况。这是为什么呢?今天我们来一起探究一下
写一段程序
首先打开我们常用的宇宙最强CPP编辑器VS,然后写入下面的代码,注意到源代码是没有初始化字符串直接打印的
#include <iostream>
using namespace std;int main()
{char stringz[32];cout << stringz << endl;char* intp = (char*)(stringz);cout << (int)(*intp) << endl;return 0;
}
观察一下运行效果
我们观察到了什么?
- 有烫烫烫出现
- 后面还有不明所以的字符出现,数量不多
- 首字的值为-52 (十六进制为CC)
不出所料,出现了预期之中的烫烫烫效果ψ(`∇´)ψ复现完毕,下面来寻找答案,内存是CPP中的重要命题,现在又是没有初始化内存就打印,问题很有可能出现在内存上,字符串的首地址是对应的数值-52,这值得我们注意,这是被随机分配的内存上的残值吗?
问题探究
在VS上写,就要用强大的VS辅助工具,点开调试,再观察内存
点击调试/窗口/找到内存
调试运行,观察内存上的值
不出所料啊,字符串开头的全被填充为CC CC了,这和我们刚刚观察到的-52刚好匹配
可能有人会问:CC和-52有啥关系?这就是计算机基础的重要性了
C是16进制CC的位就是1100 1100 ,对应的补码就是-52!(计算机里的数值总是以补码的形式存在)
豪德,现在我们可以确认一件事:在VS中,没有被初始化的字符串,VS会默认的使用CC去填充他的每一个字节,而并非随意的分配一段余残值的内存
豪德,那和烫烫烫有什么关系呢?不急,我们联想一下中文编码的问题,GBK!(中文国标扩展码)
CCCC 两个字节对应的 GNK恰好是烫!
好了,所有的问题都解决了♪(´▽`)
总结
下面让我们来解释一下我们看到的现象
我们观察到了什么?
- 有烫烫烫出现
- 后面还有不明所以的字符出现,数量不多
- 首字的值为-52 (十六进制为CC)
解释就是
1&3 VS会把未初始化的字符串的内存全部置为CC(1100 1100 ,-52) ,这恰好对应了GBK中的烫烫烫
(不保证在其他不是VS的编译器中复现)(所以初始化真的很重要啊)
2为什么会有不明所以的字符出现?32字节的内存,刚好对应16个烫字啊,也很简单,标准的C风格字符串总是以/0 结尾的,而VS填充的字符串却没有/0这个结尾,所有它会一直打印,直到遇到内存中的0.(观察第四个图中的内存表,就是这样的)
OK,最近学习的事情真的很多啊,所以一直没有更新,这个话题也是很久以前感兴趣的,今天一鼓做气把它写完了(●’◡’●)
就是这样–
你们的基本操作
24/11/10