共用体很少用,今天遇到一个问题:
#include <stdio.h>
#include <stdlib.h>
int main()
{
union EXAMPLE
{
struct
{
int x;
int y;
} in;
int a;
int b;
} e;
e.a=1;
e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf("\n%d,%d",e.in.x,e.in.y);
printf("\n%d,%d",e.a,e.b);
return 0;
}
程序输出到结果是:
4,8
4,4
为了知道原因,把内存地址打印出来,在return 0前添加以下语句
printf("\naddr(x):%x\naddr(y):%x\n", (unsigned int)&e.in.x, (unsigned int)&e.in.y);
printf("addr(a):%x\naddr(b):%x\n", (unsigned int)&e.a, (unsigned int)&e.b);
输出的结果为
可以看到,e.in.x e.a e.b 是同一片内存,根据结果画出内存分布(4 = 0.0.0.00000100 8 = 0.0.0.00001000)
小端机器
0xbfc38948 00001000 00000000 00000000 00000000 (x a b 都是这片内存) 设为addr1
0xbfc3894c 00000100 00000000 00000000 00000000 (y) 设为addr2
所以,x == a == b
e.a=1; //addr1 = 1
e.b=2; //addr1 = 2
e.in.x=e.a*e.b; //addr1 = a*b = 2*2 = 4
e.in.y=e.a+e.b; //addr2 = a+b = 4*4 = 8