以下是引用方一鸣在2011-9-4 11:36:09的发言:
31.有以下程序:
#include <stdio.h>
union pw
{ int i;
char ch[2];}a;
main()
{a.ch[0]=13;a.ch[1]=0;printf(″%d\n″,a.i);}
程序的输出结果是( )
A.13
B.14
C.208
D.209
我理解的是:共用体只能存一个数据的,所以main中每输入一个前一个就给替换了,所以a.i我认为应该是0的 ,但是结果为何是13呢 ! 求帮助
你说的很对,共用体只能存一个数据的,所以main中每输入一个前一个就给替换了,但是ch[2],其实应该看作是一个数据
(数组);如果 printf("size of union a:%d\n",sizeof(a));输出多少呢?如果char ch[10];又输出多少呢?
前面的结果是 sizeof(int),后面是10;所以在输入a.ch[0]=13;再输入a.ch[1]=0;a.ch[0]并不会变为0,因为他们本来就属于不同的内存空间,
我们假设int型是4个字节,如下图
a.i
a.ch[]
b1___13___
ch[0]___13___
b2___0____
ch[1]___0___
b3______
b4______
如果我们输入a.i=0xeee,那么猜想ch[0]=0xee,ch[1]=0xe;
通过编程验证:printf("a.ch[0]=0x%x\ta.ch=[1]0x%x\n",(unsigned char)a.ch[0],a.ch[1]);
结果如上猜想,接着我们再输入a.ch[0]=0x11; 我推测a.i=0xe11,a.[1]=0xe;编程验证:
a.ch[0]=0x11;
printf("a.ch[0]=0x%x\ta.ch=[1]0x%x\n",(unsigned char)a.ch[0],a.ch[1]);
printf("a.i=0x%x\n",a.i);
结果果真如此!
到此我想聪明的你应该知道是怎么回事了吧!