烫烫烫

阿尔博特 2011-11-12 10:37:30
#include<iostream>
using namespace std;
int main()
{
char ch = 'a';
char *cp = &ch;
cout<<cp<<endl;
int i = 3;
int *p = &i;
cout<<p<<endl;
}
为什么第一个输出 a烫烫C(反正是乱码)
第二个输出0012FF10(地址)
...全文
315 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦的怒放 2011-11-15
  • 打赏
  • 举报
回复
像这种问题 一般的情况都是数组的越界 建议你将数组的范围放大试试!
qwer_boo 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 a707000646 的回复:]

跟着很多星星的人学习总是好的
[/Quote]
yisikaipu 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gameslq 的回复:]本想打印单个字符‘a',却传递给<<一个指针cp,所以<<当作字符串来处理了
就出现了乱码
改进方法:
cout<<ch<<endl;
或者
cout<<*cp<<endl;

在debug和release出现不同乱码正常的,字符串是'\0'结尾,cp的指针结尾不知在哪呢
[/Quote]


楼主不大可能连cp与*cp都无法区分

合理的推测是楼主想输出字符a的地址,却得到一个乱码字符串。这是一个很常见的困惑,比较优雅的解决方式就是输出指针总是写成:cout <<(void*)cp;

不同乱码的原因是相关内存是否被填充为烫,而不是指针结尾不知在哪
yisikaipu 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jackhanzy 的回复:]我又在release下执行了一下,没有输出烫,而是看不懂得东西。问一下debug和release有什么区别?[/Quote]

http://bm.kdd.cc/index.asp可查询到“烫”的gbk编码:CCCC

就VS而言,调试器是否要把相关内存填充为CCCC,取决于相关的 /RTC 编译选项是否指定,这与debug/release配置无必然关系。但默认情况下,debug配置总是打开相关/RTC选项,而release配置默认为速度优化,不允许打开相关/RTC选项。如果设置为无优化的release配置,同样可以打开相关的/RTC选项

如果在默认debug配置的基础上关闭相关/RTC选项,就不会输出烫了

如果在无优化的release配置基础上开启相关/RTC,同样会输出烫

debug/release的最基本差别是debug定义了_DEBUG宏,倘若把这个也抹掉,两者就无本质差别,只是默认配置不同而已

/RTC 参看http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
LZS535261548 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 frankhb1989 的回复:]
Microsoft C&C++ Debugger会在未初始化的栈内存的每个字节置0xCC,0xCCCC以GBK编码输出就是“烫”。
[/Quote]
支持 曾经我也遇到这个问题
a707000646 2011-11-12
  • 打赏
  • 举报
回复
跟着很多星星的人学习总是好的
iamnobody 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jackhanzy 的回复:]
我又在release下执行了一下,没有输出烫,而是看不懂得东西。问一下debug和release有什么区别?
[/Quote]

烫是debug时用来填充内存用的,用来方便检查访问越界和是否未初始化就访问。(看到烫基本就这个问题了)。

release下为了速度,当然不会做这种越界检测,也不会给他初始化为烫,因为这时已经默认你的程序不会犯这样的错误了。
gameslq 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jackhanzy 的回复:]
我又在release下执行了一下,没有输出烫,而是看不懂得东西。问一下debug和release有什么区别?
[/Quote]

问题出在cout(ostream)重载了操作符<<
比如:
 
ostream& operator <<( char ch );//打印单个字符
ostream& operator <<( unsigned char uch );
ostream& operator <<( signed char sch );
ostream& operator <<( const char* psz ); //打印字符串
...


你的代码

char ch = 'a';
char *cp = &ch;
cout<<cp<<endl;



本想打印单个字符‘a',却传递给<<一个指针cp,所以<<当作字符串来处理了
就出现了乱码
改进方法:
cout<<ch<<endl;
或者
cout<<*cp<<endl;

在debug和release出现不同乱码正常的,字符串是'\0'结尾,cp的指针结尾不知在哪呢

阿尔博特 2011-11-12
  • 打赏
  • 举报
回复
我又在release下执行了一下,没有输出烫,而是看不懂得东西。问一下debug和release有什么区别?
Clovstul 2011-11-12
  • 打赏
  • 举报
回复
关键字: 'a' - 字符 字符串 - “”- ‘/0'
xiejijun_05 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yisikaipu 的回复:]

cout字符指针被认为是要输出一个字符串,即以&ch起始,以'\0'终止的一个字符串
cout整型指针被认为是要输出一个地址
如果想输出字符指针表示的地址,需要写成cout <<(void*)ch;
[/Quote]
++
yisikaipu 2011-11-12
  • 打赏
  • 举报
回复
更正: cout <<(void*)cp;
yulinlang 2011-11-12
  • 打赏
  • 举报
回复
因为cout输出char *时是将其作为C风格字符串(以'\0'终止的字符数组)来输出的,ch存储空间分配在栈上,后面的内容都是未初始化的,在debug模式下,VC会把未初始化的栈全部填成0xcc,当作字符串来看就是"烫烫....",直到遇到'\0'为止。

对于int *,cout只是输出指针的值,也就是地址。
woshiwaiwai 2011-11-12
  • 打赏
  • 举报
回复
C++中对于char *类型的指针,当你使用cout<<输出时,是从这个指针指向的地址开始的一个字符串,字符串就是以'\0'结束的,所以输出会输出a后继续输出直到遇到'\0'结束。
而对于int *,使用cout <<输出的是地址
总之就是char *类型的比较特殊
yisikaipu 2011-11-12
  • 打赏
  • 举报
回复
cout字符指针被认为是要输出一个字符串,即以&ch起始,以'\0'终止的一个字符串
cout整型指针被认为是要输出一个地址
如果想输出字符指针表示的地址,需要写成cout <<(void*)ch;
無_1024 2011-11-12
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
int main()
{
char ch = 'a';
char *cp = &ch;
cout << cp[0] << endl;//输出值
cout << &cp<< endl;//这样才是首地址
int i = 3;
int *p = &i;
cout << p << endl;
return 0;
}

FrankHB1989 2011-11-12
  • 打赏
  • 举报
回复
Microsoft C&C++ Debugger会在未初始化的栈内存的每个字节置0xCC,0xCCCC以GBK编码输出就是“烫”。
無_1024 2011-11-12
  • 打赏
  • 举报
回复
原因是cout重载了 operator << (ostream & out,char *)
所以你cout <<cp << endl;
如果cp是char*的话 就会输出紧接着的一连串字符串
taodm 2011-11-12
  • 打赏
  • 举报
回复
楼主知道什么叫“字符串”么?
pengzhixi 2011-11-12
  • 打赏
  • 举报
回复
哦 越界访问了。这个是vc编译器的特性。就是在ch后面插入了0xcc 0xcc对应于汉字是烫

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧