当前位置: 首页 > news >正文

控制台中,为什么会打印出烫烫烫?--那些中文乱码问题【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;
}

观察一下运行效果
在这里插入图片描述
我们观察到了什么?

  1. 有烫烫烫出现
  2. 后面还有不明所以的字符出现,数量不多
  3. 首字的值为-52 (十六进制为CC)

不出所料,出现了预期之中的烫烫烫效果ψ(`∇´)ψ复现完毕,下面来寻找答案,内存是CPP中的重要命题,现在又是没有初始化内存就打印,问题很有可能出现在内存上,字符串的首地址是对应的数值-52,这值得我们注意,这是被随机分配的内存上的残值吗?

问题探究

在VS上写,就要用强大的VS辅助工具,点开调试,再观察内存

点击调试/窗口/找到内存

在这里插入图片描述
调试运行,观察内存上的值
在这里插入图片描述
不出所料啊,字符串开头的全被填充为CC CC了,这和我们刚刚观察到的-52刚好匹配

可能有人会问:CC和-52有啥关系?这就是计算机基础的重要性了
C是16进制CC的位就是1100 1100 ,对应的补码就是-52!(计算机里的数值总是以补码的形式存在)
在这里插入图片描述
豪德,现在我们可以确认一件事:在VS中,没有被初始化的字符串,VS会默认的使用CC去填充他的每一个字节,而并非随意的分配一段余残值的内存

豪德,那和烫烫烫有什么关系呢?不急,我们联想一下中文编码的问题,GBK!(中文国标扩展码)
CCCC 两个字节对应的 GNK恰好是烫!
在这里插入图片描述
好了,所有的问题都解决了♪(´▽`)

总结

下面让我们来解释一下我们看到的现象

我们观察到了什么?

  1. 有烫烫烫出现
  2. 后面还有不明所以的字符出现,数量不多
  3. 首字的值为-52 (十六进制为CC)

解释就是
1&3 VS会把未初始化的字符串的内存全部置为CC(1100 1100 ,-52) ,这恰好对应了GBK中的烫烫烫
(不保证在其他不是VS的编译器中复现)(所以初始化真的很重要啊
2为什么会有不明所以的字符出现?32字节的内存,刚好对应16个烫字啊,也很简单,标准的C风格字符串总是以/0 结尾的,而VS填充的字符串却没有/0这个结尾,所有它会一直打印,直到遇到内存中的0.(观察第四个图中的内存表,就是这样的)

OK,最近学习的事情真的很多啊,所以一直没有更新,这个话题也是很久以前感兴趣的,今天一鼓做气把它写完了(●’◡’●)

就是这样–
你们的基本操作
24/11/10


http://www.mrgr.cn/news/70073.html

相关文章:

  • scala的练习题
  • 常用字符串和集合处理工具类
  • 区块链赋能Web3:数据透明与隐私保护的新纪元
  • Caused by: org.apache.flink.api.common.io.ParseException: Row too short:
  • 显示器接口种类 | 附图片
  • 【软考】系统架构设计师-计算机系统基础(1):计算机硬件
  • 编程范式(Programming paradigm)
  • 多线程的创建方式以及及Thread类详解
  • 2024下半年系统架构师考试【回忆版】
  • 大数据程序猿不可不看的资料大全
  • 【模型】EfficientvitSAM
  • PGMP-串串01概述
  • multi_agents
  • 10个文献翻译工具推荐,实现专业翻译的好帮手。
  • 多处理器一致协议(MSI)协议详细介绍
  • #渗透测试#SRC漏洞挖掘#深入挖掘CSRF漏洞01
  • Linux学习笔记之软件包管理RPM与YUM
  • 渗透测试-网络基础(1)
  • 时序预测 | 改进图卷积+informer时间序列预测,pytorch架构
  • 《Docker镜像与容器技术基础操作及应用研究》
  • shodan5(泷羽sec)
  • core-js 解决浏览器兼容性问题的工具之一
  • css3D变换用法
  • langgraph_plan_and_execute
  • 青龙面板脚本--阿里云盘任务脚本
  • 【网络安全】Java线程安全及非线程安全