有趣的问题~~~ 基础好的进来看看~~ 呵呵~~~

r_swordsman 2004-12-23 10:52:38
#include <iostream.h>

union _un
{
struct _st
{
int a;
char b[28];

}st;
char *s;
} un;

void main()
{
char c;
strcpy(un.st.b, "abcd");
un.st.a = 0x41; // 0x41 = 'A'
cout << (char*)&un << endl;
un.st.a = 0x4142;
cout << (char*)&un << endl;
un.st.a = 0x414243;
cout << (char*)&un << endl;
un.st.a = 0x41424344;
cout << (char*)&un << endl;
un.st.a = 0x4142434445;
cout << (char*)&un << endl;
cin >> c;
}

// 呵呵~~ 大家知道运行的结果么??? 知道为什么吗??????
...全文
225 点赞 收藏 12
写回复
12 条回复
tysoccer 2004年12月24日
挺有意思
回复 点赞
r_swordsman 2004年12月24日
楼上两位~~~char *s;有什么问题么???
回复 点赞
ppqi 2004年12月24日
char *s;
回复 点赞
睡在床板下_ 2004年12月23日
恩~~ 是的啊~~ 楼上楼上的 对, 我自己也试了试,
对地址的 了解~~
回复 点赞
cizi_nwu 2004年12月23日
嗯,就像 wd_wonder(奇迹)所说的那样,因为输出(char*)……遇到0就停止!
呵呵,明白了!
回复 点赞
wd_wonder 2004年12月23日
这个问题很简单啦,因为intel系列的整型数据的存储是高位在后,低位在前,所以当给un.st.a=0x41时,整个un为(按字节16进制):41 00 00 00 61 62 63 64,在遇到第一个00时就认为是字符串的结束符了,自然输出为A;当给un.st.a=0x41424344时,整个un为:44 43 42 41 61 62 63 64 自然就是
DCBAabcd了
回复 点赞
cizi_nwu 2004年12月23日
呵呵,明白了,忽略了strcpy(un.st.b, "abcd");
回复 点赞
cizi_nwu 2004年12月23日
我的结果是:
A
BA
CBA
DCBAabcd

有一个我注释掉了,因为0x4142434445超出了int值。
不太明白最后一个DCBAabcd是怎么回事……
回复 点赞
mujc1111 2004年12月23日
看汇编书
intel处理器采用little-endian寻址
回复 点赞
Cooboob 2004年12月23日
我在vc++6.0下 无法编译通过
回复 点赞
sunlu_eric 2004年12月23日
char *s;
还有这个那,上面的没有这个有意思!!!
回复 点赞
r_swordsman 2004年12月23日
wd_wonder(奇迹) 说的不错喔~~~
cizi_nwu(cizi) 的结果也正确~~但是说因为0x4142434445超出了int值~~而不知道结果~~
那结果就是"EDCBabcd"~~~因为0x41被抛弃~~但不会出错~~~
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告