C語言union(聯合體、共用體)及應用
在結構體(變量)中,結構的各成員順序排列存儲,每個成員都有自己獨立的存儲位置。聯合(union)變量的所有成員共享同片存儲區/內存。因此聯合變量每個時刻里只能保存它的某一個成員的值。
聯合變量也可以在定義時直接初始化,但這個初始化只能對第一個成員進行。例如下面的描述定義了一個聯合變量,並進行了初始化。
1 uunion data 2 { 3 char n; 4 float f; 5 }; 6 union data u1 = {3}; //只有u1.n被初始化
union的主要特征有:
union中可以定義多個成員,union的大小由最大的成員的大小決定;
union成員共享同一塊大小的內存,一次只能使用其中的一個成員;
對union某一個成員賦值,會覆蓋其他成員的值(但前提是成員所占字節數相同,當成員所占字節數不同時只會覆蓋相應字節上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因為char只占一個字節,而int占四個字節);
union量的存放順序是所有成員都從低地址開始存放的。
因此,可以用聯合(union)來判斷CPU的大小端(印第安序):
1 int checkCPU() 2 { 3 union w 4 { 5 int a; 6 char b; 7 }c; 8 9 c.a = 1; 10 11 return ( c.b == 1 ); 12 }
同樣的道理,在Linux中給出了更加精練的實現。如果宏ENDIANNESS='l'表示系統為little endian, 為‘b’表示big endian。
1 static union 2 { 3 char c[4]; 4 unsigned long l; 5 }endian_test = { {'l','?','?','b'} }; 6 7 #define ENDIANNESS ( (char)endian_test.l )