一个C语言共用体题型....

来源:百度知道 编辑:UC知道 时间:2024/06/03 05:37:14
#include <stdio.h>
void main()
{ union { int i[2];
long k;
char C[4]; }r, *s=&r;
s->i[0]=0x39; s->i[i]=0x38;
printf("%x\n",s->C[10]);
}
这题的答案是39. 谁能详细的解释一下为什么...谢谢
不好意思.倒数第三行的那个s->i[0]=0x39; s->i[1]=0x38;我不小心打错了......还有是printf("%x\n",s->C[0]);不是C[10]

如果你没有打错的话,你的教材印错了
printf("%x\n", s->C[0]);
上面的下标不是10,应该是0
这样的话答案才是39

其实这道题偏难,解释一下:
结构体根据最长的成员分配空间,所有成员共享空间,就是说他们在内存中的地址相同。
所以题中的结构体在内存中的长度是8(就是第一个成员int数组的长度,因为它最长),long型的k占4个字节,char数组占4个字节。
然后有必要解释一下x86指令体系下的内存特性,数组在内存中存放时,按字节为单位,低字节的在低地址,高字节在高地址。举个例子:比如对于int i=4;实际占用4个字节(vc中),就是0x00000004,最低位的字节为0x04,在内存中存放顺序(内存地址由低到高)为0x04 0x00 0x00 0x00。
题中给数组i的两个元素分别赋值为0x39和0x38,他们在内存中的分布是这样的(内存地址由低到高):0x39 0x00 0x00 0x00 0x38 0x00 0x00 0x00,所以char数组C的4个元素分别为0x39,0x00,0x00,0x00。16进制方式打印C[0]就是39。