烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫

调试模式下VS会给栈内存加上额外的保护段并且用0xCC填充,0xCC在x86下是INT 3指令,这个指令会触发断点,这样调试器就可以发现程序因为越界覆盖了返回地址之类的各种各样的原因执行到了堆栈数据里面……
堆当中则会用0xCD来填充,也就是“屯屯屯屯屯”
屯和烫都是GBK编码的结果,所以只有简体中文Windows,而且程序链接了ANSI版本的API才会显示这个。现代的程序可以选择使用UTF-16的Unicode版本的库,这种情况下会变成韩文쳌쳌쳌쳌。
如果是台湾(BIG-5)则会显示“昍昍昍”,日本(Shift-JIS)应该会显示“フフフフフフ”


作者:灵剑
链接:https://www.zhihu.com/question/23600507/answer/140640887
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先,这个现象只会在windows下用vs或者vc编程时才出现,并且只会出现在debug版本的运行过程中。如果在类unix系统下,使用gcc或者clang编译器,你得到得通常会是提示segmentation fault.
vc或者vs在debug版本的程序初始化时,会将栈内未初始化的内存每个字节设置成0xcc,这个代表的是一个特殊的中断机器码,int 3,准确地说是软件调试中断。注意,这里的int是interrupt的意思,不是integer。将这些内存初始化成这个样子是为了方便用户进行断点调试。
然而,当你的程序出现了访问未出初始化的栈内存时,例如,数组越界,就会访问这个特殊的字节,如果你把它打印出来,通常会进行ascii码的映射。可是,0xcc对应的十进制是204,然而ascii码的范围是0~127啊!所以,对于一个超过ascii码表示范围的字符,程序通常会尝试使用unicode编码,unicode编码是16位的,所以0xcc会被扩展称为0xcccc,我们验证一下“烫”的unicode编码值:

1. 首先如果不是用windows,不是用vs或者vc那么不会出现。
2. 如果不是debug模式,也不会出现。通常会是乱码。
以上的条件决定了编译器是否会用0xcc填充非初始化栈内存。

3. 如果以上条件都满足,那么能不能出现烫要看你的编程环境和操作系统是否支持gbk编码集,然而,大多数的英文操作系统并不默认支持。所以很可能还是按照unicode的方式去翻译。

作者:马超
链接:https://www.zhihu.com/question/23600507/answer/55608434
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


《程序员的自我修养-链接装载与库》:
在vc调试下,未初始化的变量或内存区域的值是“烫”
 之所以出现这么一个奇怪的字,就是因为Debug模式在第四步里,将所有的分配出来的栈空间的每一个字节
都初始化为 0xCC。0xCCCC(即两个连续排列的0xCC)的汉字编码就是烫。
 将未初始化的数据设置为0xCC的理由是怎样有助于判断一个变量是否经过了初始化,仅供参考,不能以此为证据
有时编译器也会以0xCDCDCDCD为初始化标记:“屯屯”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值