字符值为0xcc

VS studio msvc | 堆栈默认值 烫屯葺 0xCC、0xCD、0xFD、0xDD 预设值 说明 0xCC 栈上申请的,未初始化的变量,的缺省值 0xCD 堆上申请的,未初始化的变量,的缺省值 0xDD 堆上申请的,所在空间释放后,的缺省值 0xFD 在已申请的堆区空间上,设定上下边界值 而以上三者的输出结果就是 烫烫烫屯屯屯葺葺葺。 使用 visual studio 演示: 1、栈空间未初始化空间缺省值为 0cCC ,堆空间未初始化空间缺省值为 0cCD 2、边界栅栏值 0xFD 。 tips: 这也是为什么单个堆对象不能用 delete ... 阅读详情

0xcc  16进制数,相当于十进制的204

未初始化的变量
DEBUG模式下运行时,未初始化的变量会被系统赋初值为0xCC

 

未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。

 

烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫
是debug中未初始化的栈变量
屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯
是debug中未初始化的堆变量

 

 

 浅析"烫烫烫烫"是怎么来的

 

浅析"烫烫烫烫"是怎么来的

在用VC写代码时,经常会遇到在栈中申请空间的并且没有被初始化的字符数组就会显示"烫烫烫烫。。。",虽然是知道编译器对栈中没有初始化的数据会进行默认的初始化工作,但是一直不得要领,在拜读《程序员的自我修养》的时候有所收获,还挺有意思的,写出来和大家分享。

代码很简单,就是在栈中申请了一个大小为4个字节的字符数组。

 

 

用断点查看X的值,可以发现,“烫烫”出现了:

x 0x0012ff60 "烫烫烫烫?" char [4]

查看反汇编:

 

 

简单解释一下关键句的含义:

004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh]

将获得的0CCh大小的栈空间首地址赋给edi

004113B2 B9 33 00 00 00   mov         ecx,33h

rep的循环次数为33h
004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh

eax = 0CCCCCCCCh 
004113BC F3 AB            rep stos    dword ptr es:[edi]

将栈空间的33H个双字节赋值为0CCCCCCCCh

而0xcccc用汉语表示刚好就是“烫”

oxcc正好是中断int 3的指令 起到保护作用

 

 

为什么DEBUG的时候,内存里都是“烫烫烫烫烫烫烫烫烫……”呢?

 

 

是内存太热了吗?哈哈,当然不是。。

以下转自优快云

在   Debug   模式下会自动加上   /GZ   编译选项,它可以帮助捕获内存错误。   
    
  /GZ   选项会做以下这些事   
    
  (1)   初始化内存和变量。包括用   0xCC   初始化所有自动变量,0xCD   (   Cleared   Data   )   初始化堆中分配的内存(即动态分配的内存,例如   new   ),0xDD   (   Dead   Data   )   填充已被释放的堆内存(例如   delete   ),0xFD(   deFencde   Data   )   初始化受保护的内存(debug   版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且   32   位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在   Debug   版中发现   Release   版才会遇到的错误。要特别注意的是,很多人认为编译器会用   0   来初始化变量,这是错误的(而且这样很不利于查找错误)。   
    
  (2)   通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配)   
    
  (3)   函数返回前检查栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略FPO)   
    
  “烫”字的MBCS编码为“CCCC”,而用   /GZ   选项对自动变量会用“0xCC”初始化,连续的“0xCC”将被误读成“烫”字符。

 

 

 

reference:http://topic.youkuaiyun.com/u/20080511/14/65665c70-4110-48ea-b736-b4489d29ddde.html

http://www.websnap123.com/show-TXpFeU56RXc=.html

http://baike.baidu.com/view/998109.htm

http://blog.youkuaiyun.com/xiakan008/archive/2010/10/22/5958405.aspx

http://blog.youkuaiyun.com/colinchan/archive/2010/05/13/5587954.aspx

http://student.youkuaiyun.com/space.php?uid=1070271&do=thread&id=34721

 

http://topic.youkuaiyun.com/u/20101113/18/1147ab97-257c-44ba-a903-d06034f7e6f1.html 

http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238.html

 

C++ 中常见异常内存地址或异常值的说明(0xcccccccc、0xcdcdcdcd、0xfeeefeee 和 0xdddddddd 等) 内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值 ) 阅读详情

相关推荐

Windows BITS服务:后台智能文件传输技术详解

后台文件传输技术是现代IT基础设施中的关键组件,Windows BITS(Background Intelligent Transfer Service)作为微软原生解决方案,通过队列管理和智能调度实现高效数据传输。其核心技术原理包括分块传输、断点续传和带宽自适应,能够根据网络状况动态调整传输速率(默认占用空闲带宽的80%)。在工程实践中,BITS特别适用于企业软件分发和自动化数据采集场景,通过PowerShell命令即可实现高优先级传输和代理配置。相比传统FTP方案,BITS在跨国文件传输中将失败率从30

weixin_42116058的博客 274

0xcc

堆栈中的局部变量(包括指针)在明确初始化之前都用0x0cc进行初始化。这是编译器在作运行时检测用的,方便发现变量没有初始化、内存溢出的问题。       0xcc执行检测的原理:      (1)变量:如果没有给它初始化,那么值就是0xcc。      (2)指针:或者说内存,初始时赋给地址0xcc。这是一块内核的内存,一般情况下不能被操作的,因此,当发现对地址为0xcc的内存进行操作,就说明是非法的,提示溢出。      0xcc输出成字符就是“烫烫...”,这就是为什么未初始化的内存总显示“

suhuaiqiang_janlay的专栏 3684

【解决问题】‘vue‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

【解决问题】'vue' 不是内部或外部命令,也不是可运行的程序或批处理文件。

weixin_44566194的博客 4万+

为何栈的初始化为0XCC

x86系列处理器从其第一代产品英特尔8086开始就提供了一条专门用来支持调试的指令,即INT 3,其机器码就是我们熟悉的0XCC,转换成十进制为-858993460,转换成汉字就是“烫”。简单地说,这条指令的目的就是使CPU中断(break)到调试器,以供调试者对执行现场进行各种分析。当我们调试程序时,可以在可能有问题的地方插入一条INT 3指令,使CPU执行到这一点时停下来。这便是软件调试中经常用

doubleintfloat的博客 6730

[小梅哥FPGA] 如何通过动态重配置实现FPGA时钟的实时频率/相位/占空比调整?

PLL和MMCM是实际存在的硬件电路,用以对输入时钟的负面变化,如抖动、频率变化、相位偏移、占空比失真等进行处理。基于该表,用户在初始化Clk_Wiz后,只需要计算好所需的频率、相位、占空比对应的设置值,使用Xil_Out32函数配置对应寄存器即可。通过上述步骤,在平时的开发调试过程中,亦或是一些对于时钟可能有着实时性要求的设计(如数据采集、图像处理)里,我们便可以在无需重新修改设计的前提下,通过AXI4总线来完成对时钟频率、相位的调控,从而达到缩短设计周期以及让设计适应更多场景的目的。

zgmxs的专栏 2493

VulnHub--mrrobot

Vulnhub靶场--Mr robot 靶机

记录笔记 1095

运行程序时遇到的问题

字符值oxcc指的是不可显示的字符,Debug模式下未初始化的变量会被系统赋初值为oxcc 有时候输出不对时需要用 endl,而不是“\n”,endl可以清空 无法包含头文件时,重新跑一下conan,跟第三方库有关 不要用ofstream,效率低,问题多,直接用fopen()\fwrite()\fread()\fclose() ...

qq_32563489的博客 402

Vite 任意文件读取漏洞复现(CVE-2026-39363)

Vite开发服务器 WebSocket中的fetchModule方法未实施server.fs访问控制,导致攻击者可通过WebSocket连接并读取服务器上的任意文件(CVE-2026-39363)

iSee857的博客 220

为什么局部变量不初始化,VS2013 打印出来的刚好是 -858993460?

《揭秘VS2013的"魔数"-858993460和"烫烫烫"现象》 在VS2013的Debug模式下,未初始化的局部变量会显示为-858993460或"烫烫烫",这并非程序错误,而是编译器的调试机制。由于C语言为追求性能不默认清零局部变量,VS在调试时会用0xCC填充内存:十六进制0xCCCCCCCC转为十进制补码即-858993460;而GBK编码中0xCC对应汉字"烫",造成字符串乱码。解决方法很简单:始终初始化变量(如in

u012732668的博客 418

【主题建模】一种基于深度学习的主题建模方法:BERTopic(理论篇)

在我的博客中已经写了很多关于主题建模的内容,当你准备了解 BERTopic 时,默认你已经知道了 LSA、pLSA、NFM、LDA 等传统的主题建模方法。关于主题建模的前置知识我在这里不做赘述,感兴趣的同学可以看看我前几篇博客。学习 BERTopic 需要一定的机器学习基础,让我们一起开始吧!

Data · Model · Agent · Repeat 9892

SCI论文发表很容易【5】:比较容易中的期刊

整理了一些经管方面比较容易中稿的期刊,可供大家参考

qq_25018077的博客 1678

控制台中,为什么会打印出烫烫烫?--那些中文乱码问题【more cpp-8】

在我们写出BUG并且打印字符串的时候,常常会遇到**控制台中打印出烫烫烫**的情况。这是为什么呢?今天我们来一起探究一下

FlamBoyanceI的博客 1202

Arduino开发实例-EMG 肌肉信号传感器

在医学研究中,测量肌肉的活动、收缩和扩张非常重要。 EMG 肌肉传感器测量肌肉活动并产生信号以显示扩张和收缩量。 因此,输出取决于所选肌肉的活动量。 3 绿色、红色和黄色电极连接到模块,用于传输来自肌肉运动的电信号。

视觉与物联智能 1698

屯,烫,췍,쳌之谜

其实很简单,这些特殊的字符串其实就是堆栈里面的数据初始化问题。我们看一段简单的代码#include"stdafx.h" #include int_tmain(intargc, _TCHAR* argv[]) { wchar_tszTestU[260]; charszTestA[260]; wchar_t *pU =(wchar_t *) malloc( sizeof(wchar_t)* 100 ); char *pA =(char

MagicFuzzX的专栏 2964

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++常识“屯”和“烫”

(参考:)   在Debug模式下,VC会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。但是Release模式下不会有这种附加动作,原来那块内存里是什么就是什么。   未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中...

weixin_34235371的博客 165

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC 6.0中的“烫”和“屯”

在VC 6.0的Debug模式下,未初始化栈空间的每个字节都会被置成0xCC,而0xCCCC对应的中文字符就是“烫”。另外,未初始化堆空间会被置成0xCD,0xCDCD对应的中文字符是“屯”..这就是为什么C++新手常见到这俩字的原因了...

guxue365的专栏 1605

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

内存被填充为0xcc

内存被填充为0xcc VS2019如何查看内存 打断点 debug中选择调试->窗口->内存 VS2019查看变量地址 debug中查看右下角即时窗口 输入&变量名即可查看地址 内存填充为0xcc 随便写一段代码: #include <iostream> using namespace std; int main() { int a = 0; int b = 1; return 0; } 查看a变量附近的内存布局 查看变量b附近的内存布局 我们

weixin_43891775的博客 829

将形如 0xAABBCC拆分成形如 三个数0xAA,0xBB,0xCC 及逆过程

将形如 0xAABBCC拆分成形如 三个数0xAA,0xBB,0xCCprivate static  int[] Int2Arr(int a){ int[] s = new int[3]; s[0]=(a&0xff0000)>>16; s[1]=(a&0xff00)>>8; s[2]=a&0xff; return s; } 将三个数0xAA

xuliqin1989的专栏 1385

内存特殊值0xcccccccc、0xcdcdcdcd、0xfeeefeee

在vc中,指针初始值为0xcccccccc,所有指针好像都为这个,为什么,和NULL有什么关系? VC的DEBUG版会把未初始化的指针自动初始化为0xCCCCCCCC(0xcccccccc是程序不能访问的地址,访问时会触发异常,当然换个别的也有这个效果,可能c是1100的缘故,被MS使用了)因为万一不小心访问了这个地址,是很容易出问题的,不像0x00000000,很容易让本该在调

Acheld的博客 1648

String内的字符以0x形式在byte[]中显示

原字符串:String str="CCBBAA";  我所想得到的结果: byte[] byte={0xCC,0xBB,0xAA}; 在刚开始想进行转化的时候想了各种办法,得到的结果都不如人意,所以记录下来之后从网上找到的一个可行的办法 在程序中调用下面函数,byte=hexStringToBytes(str);就得到  byte[] byte={0xCC,0xBB,0xAA};

qq_39705026的博客 1657

C语言-神器的字符串结束符\0

栈内存是程序运行时用于存储局部变量、函数调用信息的内存区域,由系统自动分配和释放,遵循"后进先出"(LIFO)原则。简单理解:栈内存就像"临时工作台",函数执行时临时使用,用完自动清理;堆内存则是"仓库",需要时申请,用完后需手动归还。编码格式是计算机中用于将字符(文字、符号等)转换为二进制数字的规则系统,解决"字符如何存储和传输"的问题。不同编码使用不同的二进制序列表示同一个字符,如果编码和解码时使用的格式不一致,就会出现乱码。

qq_25212845的博客 1180

为什么局部变量不初始化,VS2013 打印出来的刚好是 -858993460

摘要: 在VS2013的Debug模式下,未初始化的局部变量会显示为固定值-858993460或“烫烫烫”,原因是编译器将内存填充为0xCC(调试中断指令)。十六进制0xCCCCCCCC转为带符号整数即-858993460,而GBK编码中0xCC对应汉字“烫”。这是VS的调试警告机制,提醒开发者变量未初始化。解决方法是养成初始化变量的习惯(如int score = 0;)。其他编译器(如GCC)可能不会出现相同行为,因其内存处理策略不同。这一现象揭示了C语言对性能的妥协与调试工具的巧妙设计。 关键词:VS2

u012732668的博客 314

错误的字符串值text mysql,如何修复“不正确的字符串值”错误?

After noticing an application tended to discard random emails due to incorrect string value errors, I went though and switched many text columns to use the utf8 column charset and the default column c...

weixin_39816260的博客 221

从未初始化的字符串说起

未赋值的字符串为什么会显示“烫”呢?在这里,我会简单的向大家说明一下,欢迎有兴趣的朋友来看看和一起讨论一下

Cantaloupe77的博客 1436

小知识:烫烫烫...是怎么来的

之所以上面的程序输出“烫”这么一个奇怪的字,是因为main函数调用时,在栈区开辟的空间的其中每一个字节都被初始化为0xCC。 而0xCC是怎么来的呢? 画红框里的代码就是实现函数空间的初始化的,第三行代码的意思就是: 将所有开辟的空间都初始化为0CCCCCCCCh,也就是0xCC。(详见函数栈帧的创建和销毁) 接下来我们回归正题。 arr数组是一个未初始化的数组,恰好在main函数的栈帧空间上创建的,0xCCCC(两个连续排列的0xCC)的汉字编码就是“烫”,所以0xCCCC被当作文本就是..

m0_64318128的博客 1245
上一篇: chrome插件运作机理
下一篇: 汇编语言call指令与ret指令的研究
fallinsky
博客等级 码龄18年 24粉丝 54原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值