作者:十月天文
union [tag]{member definition;member definition;...member definition;[variables];
union test{int i;float f;double d;char str[20];} data;
union test{int i;float f;double d;char str[20];};int main( ){union test data;printf( "data size : %d\n", sizeof(data));return 0;}
/*beginner/union/union2.c*/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弄啥嘞,感覺什么跟什么呀,只有最后的字符串是正確的,這也就間接證明了共用體使用相同的存儲空間,其他類型的賦值會破壞原先的賦值,正常情況下只有最后一次的賦值才會保證正確結果。
/*beginner/union/union3.c*/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;}
再次運行,可以看到結果就按照預想的進行了。
#beginner/union/MakefileALL : union1 union2 union3union1: union1.cgcc -o union1 union1.cunion2: union2.cgcc -o union2 union2.cunion3: union3.cgcc -o union3 union3.c: cleanclean:rm -f union1 union2 union3
$ ./union2data.i : 1819043144data.f : 1143139122437582505939828736.000000data.str : Hello World$ ./union3data.i : 123data.f : 456.000000data.str : Hello World
typedef struct{unsigned int red;unsigned int green;unsigned int yellow;} TrafficLight;
此時如果看一下TrafficLight結構體的大小,應該是12個字節
typedef struct{type name : width;}
typedef struct{unsigned int red : 1;unsigned int green : 1;unsigned int yellow : 1;} TrafficLight1;
/*beginner/struct/struct6.c*/int main(){typedef struct{unsigned int red;unsigned int green;unsigned int yellow;} TrafficLight;TrafficLight trafficlight;printf("The size of TrafficLight %d\n", sizeof(trafficlight));typedef struct{unsigned int red : 1;unsigned int green : 1;unsigned int yellow : 1;} TrafficLight1;TrafficLight1 trafficlight1;printf("The size of TrafficLight1 %d\n", sizeof(trafficlight1));return 0;}
#beginner/struct/Makefilestruct6: struct6.cgcc -o struct6 struct6.c
運行輸出如下:
$ ./struct6The size of TrafficLight 12The size of TrafficLight1 4
warning: implicit truncation from ‘int’ to bit-field changes value from 2 to 0 [-Wbitfield-constant-conversion]
-END-
推薦閱讀