高分求助,请解释一下这个程序的结果

tjucruiser 2011-11-27 05:28:32
#include <iostream.h>
#include <iomanip.h>
union Num
{ char a[4];
int b;
};
void main()
{ Num x;
x.a[0]=‘A’;
x.a[1]=‘B’;
x.a[2]=‘C’;
x.a[3]=‘D’;
cout<<x.a<<endl;
cout<<x.b<<endl;
cout<<hex<<x.b<<endl;
}

输出结果:
ABCD?<>捡
1145258561
44434241

为什么第一个输出后面有乱码?
...全文
162 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
goldbeef 2011-11-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 leo_wanta 的回复:]

引用 11 楼 goldbeef 的回复:

引用 10 楼 leo_wanta 的回复:

很简单

联合体Num里面char a[4];是一个字符数组,cout<<x.a<<endl;默认会输出一个字符串,而字符串是以'\0'结尾的,a[0], a[1], a[2], a[3]都不是'\0',cout会继续输出直到遇到'\0'为止, 事实上这个输出已经数组越界了
同志,你的头像……
[/Quote]呵呵,有点像赤木刚宪
lancerEx 2011-11-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 goldbeef 的回复:]

引用 10 楼 leo_wanta 的回复:

很简单

联合体Num里面char a[4];是一个字符数组,cout<<x.a<<endl;默认会输出一个字符串,而字符串是以'\0'结尾的,a[0], a[1], a[2], a[3]都不是'\0',cout会继续输出直到遇到'\0'为止, 事实上这个输出已经数组越界了
同志,你的头像好好笑啊。。。肿了?
[/Quote]

被人打了一拳
tjucruiser 2011-11-28
  • 打赏
  • 举报
回复
多谢,明白了
nizizhu 2011-11-27
  • 打赏
  • 举报
回复
巩固了,
tianmo2010 2011-11-27
  • 打赏
  • 举报
回复
第一:字符串是以'\0'结尾的,而LZ的char a[4]中没有人为的赋值'\0',导致结果输入最后有乱码

第二:可能你的机器是小端存储,内从的存储状况(16进制)如下:
41 42 43 44,在输出x.b即将这四个字节以整数输出,由于是小段存储,则其对应的整数是0x 44434241,其对应的十进制为1145258561

第三:就是对应的0x44434241
goldbeef 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 leo_wanta 的回复:]

很简单

联合体Num里面char a[4];是一个字符数组,cout<<x.a<<endl;默认会输出一个字符串,而字符串是以'\0'结尾的,a[0], a[1], a[2], a[3]都不是'\0',cout会继续输出直到遇到'\0'为止, 事实上这个输出已经数组越界了
[/Quote]同志,你的头像好好笑啊。。。肿了?
lancerEx 2011-11-27
  • 打赏
  • 举报
回复
很简单

联合体Num里面char a[4];是一个字符数组,cout<<x.a<<endl;默认会输出一个字符串,而字符串是以'\0'结尾的,a[0], a[1], a[2], a[3]都不是'\0',cout会继续输出直到遇到'\0'为止, 事实上这个输出已经数组越界了
goldbeef 2011-11-27
  • 打赏
  • 举报
回复
(1)连结体 x在像LZ这样的程序赋值之后,在小端机 内从的存储状况(16进制)如下:
41 42 43 44,在输出x.b即将这四个字节以整数输出,由于是小段存储,则其对应的整数是0x 44434241,其对应的十进制为1145258561
(2)当输出数组时,是将数组名所指向的地址逐个字符输出,知道遇到'\0',x.a是一个字符数组,但是C风格字符串,C风格字符串是以‘\0’结尾的字符串,所以输出x.a时会出现乱码。
(3)如果LZ这样修改代码,则输出正常
#include <iostream.h>
#include <iomanip.h>
union Num
{ char a[4];
int b;
};
void main()
{ Num x;
x.a[0]='A';
x.a[1]='B';
x.a[2]='C';
x.a[3]='D';
x.a[4]='\0';//利用数组越界,但是比较危险
cout<<x.a<<endl;
cout<<x.b<<endl;
cout<<hex<<x.b<<endl;
}
duke56 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]
因为紧接着a[3]后面不是一个结束符\0那么意味着输出一直会将a[3]后面的都输出直到遇到结束符
[/Quote]

是呀,字符串的结束符问题...

字符串是以\0来标志结束的...

联合体其实占用内存只有1个int
wjain 2011-11-27
  • 打赏
  • 举报
回复
你把
char a[4];
当做字符数组用,就是用循环遍历

char a[4];
赋值操作省略。。。
int i = 0;
for (i=0; i<sizeof(a)/sizeof(char); ++i)
{
cout << a[i];
}
cout << endl;


如果你把
char a[4];
当字符串输出,你就要加字符串结束符'\0'。

char a[4+1]
赋值操作省略。。。
a[4] = '\0';
cout << a << endl;
a707000646 2011-11-27
  • 打赏
  • 举报
回复
好多分啊,这是个小问题,结合1 2楼,没有给在终止位设定结束字符'\0'
当输出没有遇到结束字符时,就不会停止输出
内存中的东西是随机的,所以就出现了你的那段乱码
  • 打赏
  • 举报
回复
字符数组没以'\0'结尾
New_slacker 2011-11-27
  • 打赏
  • 举报
回复
最后一个数不是\0就有乱码
pengzhixi 2011-11-27
  • 打赏
  • 举报
回复
因为紧接着a[3]后面不是一个结束符\0那么意味着输出一直会将a[3]后面的都输出直到遇到结束符
lengxujun 2011-11-27
  • 打赏
  • 举报
回复
char a[4];
数组大小为4,内容为'A','B','C','D';
当以字符串方式输出时,没有正确的结束标志'\0'.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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