为什么VC经常输出烫烫烫烫烫烫烫烫(VC字符串在内存中的表示在

在Windows 上用 VC6 或者 VS 做过 C\C++ 开发的人都见过这些个有点奇怪并且还略带搞笑的字眼。

"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫"

"屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯"

很多初学者虽然经常遇到,但是并不知道这是什么梗。

其实“烫” 和 “屯” 都是按照 GBK 编码显示的结果,对应的十六进制分别为 0xcccc, 0xcdcd 。

这是微软 C\C++ 编译器在 debug 模式下,引入的一种内存保护机制,会给特定的内存赋一个特定的初值。

具体怎么赋值,赋一个什么值呢? 我来列举一下常见的几种。

未被初始化的栈内存,会被写入 0XCC 。

未被初始化的堆内存,会被写入 0XCD

堆内存的周围(前后各 4 个 Byte),会被写入 0XFD

这个区域被称为 “无人区”,写入 0XFD, 相当于是加了 Fence,用于检测数组越界。

被销毁的堆内存,会被写入 0XDD 。

微软之所以这么做,除了内存保护,我想还为了调试方便,给它们一个确定的值而不是随机值,这样可以每次运行都是相同的结果。

说了这么多,只是想让大家理解编译器的行为。

当然,不同的编译器,会有不同的行为,例如 gcc, 就不会给未初始化的变量赋初值,一切都是随机的。

附上大家关心的段子吧。

我来解说一下,其实也只有烫烫烫和屯屯屯是微软编译器搞出来的,锟斤拷和锘锘锘实际上是编码字符集转换问题。

你把锟斤拷和锘锘锘也归为微软编译器惹的祸?

微软编译器表示这个锅我不背。

本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。

是谷堆吧。新鲜的谷堆本身就是潮湿的,发烫是因为潮湿条件下,谷堆会有一定程度的发酵,产生热量。所有谷子也要及时晾干。

我要回帖

更多关于 VC字符串在内存中的表示 的文章

 

随机推荐