有趣的“烫烫烫烫”和“屯屯屯屯”

 

相信在VC下调试过代码的同学都遇到过这种情况,想看一个字符串的值,结果发现显示的是一串长长的” 烫烫烫烫烫烫烫烫”或“屯屯屯屯屯屯屯屯屯屯屯”,囧!

在Visual Studio中的Debug模式下,如果声明一个变量,但是没有初始化,微软会给未初始化的内存复制为0xCC。给为初始化的内存赋0xCC是有原因的,0xCC其实是INT3中断指令,所以如果在Debug模式下试图去执行这块未初始化的内存的话就会中断程序。

演示代码:

代码

内存:

这里出现的”烫”其实是因为VS中调试器默认的字符集是MBCS,而在MBCS中0xCCCC正好就是中文中的”烫”,所以就出现了我们熟悉的烫内存!

至于“屯”,是因为如果在堆中分配的内存,即用new 命令分配的,默认的值是0xCD。而0xCDCD在MBCS字符集里正好是“屯”。

上面那个栈内存中,除了我们分配的四个char(红色框出),还有另外几个0xCC,这些地址也是微软为我们自动填充的,主要目的也是为了防止一些越界的情况,可以让程序员在Debug模式下能够发现一些Release时会碰到的错误。这个内存填充在Release模式下是不会有的!

P.S. 不知道外国佬调试的时候看到这些中文是什么感受,哈哈哈哈!

P.S.S. 经过在英文操作系统以及英文的Visual Sutdio下测试,外国人可能不能看到伟大的中文了,因为他们电脑上很可能没有安装MBCS字符集或者说是他们的VS不会默认以MBCS来解析字符串。

posted @   imjustice  阅读(8503)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示