共用体很少用,今天遇到一个问题:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 union EXAMPLE 7 { 8 struct 9 { 10 int x; 11 int y; 12 } in; 13 int a; 14 int b; 15 } e; 16 e.a=1; 17 e.b=2; 18 e.in.x=e.a*e.b; 19 e.in.y=e.a+e.b; 20 printf("\n%d,%d",e.in.x,e.in.y); 21 printf("\n%d,%d",e.a,e.b); 22 return 0; 23 }
程序输出到结果是:
4,8
4,4
为了知道原因,把内存地址打印出来,在return 0前添加以下语句
1 printf("\naddr(x):%x\naddr(y):%x\n", (unsigned int)&e.in.x, (unsigned int)&e.in.y); 2 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