C语言 共用体的访问
共用体的访问与结构体类似,也是有2中类型,我们只看看成员访问运算符.
。
所以按照通用的赋值方式,来看一下是否按照我们预定的方式运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <stdio.h> #include <string.h>
union Data { int i; float f; char str[20]; };
int main() { union Data data;
data.i = 123; data.f = 456.0; strcpy(data.str, "Hello World");
printf("data.i : %d\n", data.i); printf("data.f : %f\n", data.f); printf("data.str : %s\n", data.str);
return 0; }
|
从结果上来看,what are you弄啥嘞,感觉什么跟什么呀,只有最后的字符串是正确的,这也就间接证明了共用体使用相同的存储空间,其他类型的赋值会破坏原先的赋值,正常情况下只有最后一次的赋值才会保证正确结果。
所以我们需要在每次赋值后直接查看结果,是可以保证结果正确的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <stdio.h> #include <string.h>
union Data { int i; float f; char str[20]; };
int main() { union Data data;
data.i = 123; printf("data.i : %d\n", data.i);
data.f = 456.0; printf("data.f : %f\n", data.f);
strcpy(data.str, "Hello World"); printf("data.str : %s\n", data.str);
return 0; }
|
再次运行,可以看到结果就按照预想的进行了。
编译运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ALL : union1 union2 union3
union1: union1.c gcc -o union1 union1.c
union2: union2.c gcc -o union2 union2.c
union3: union3.c gcc -o union3 union3.c
.PHONY : clean
clean: rm -f union1 union2 union3
|
输出结果
1 2 3 4 5 6 7 8 9
| $ ./union2 data.i : 1819043144 data.f : 1143139122437582505939828736.000000 data.str : Hello World
$ ./union3 data.i : 123 data.f : 456.000000 data.str : Hello World
|