共用体
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。
共用体变量所占的内存长度等于最长的成员变量的长度。例如,教程中定义的共用体Data各占20个字节(因为char str[20]变量占20个字节),而不是各占4+4+20=28个字节。
节省内存,有两个很长的数据结构,不会同时使用,比如一个表示老师,一个表示学生,如果要统计教师和学生的情况用结构体的话就有点浪费了!用结构体的话,只占用最长的那个数据结构所占用的空间,就足够了!
共用体应用场景
通信中的数据包会用到共用体:因为不知道对方会发一个什么包过来,用共用体的话就很简单了,定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。
#include <stdio.h> #include <string.h> // 声明共用体 union Data { int i; float f; char str[ 20 ]; }; int main() { union Data data; data.i = 10; data.f = 10.2; strcpy(data.str, "C Programming"); printf("i = %d \n", data.i); printf("f = %f \n", data.f); printf("str = %s \n", data.str); // 结束main函数 return 0; }

在这里,我们可以看到共用体的 i 和 f 成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str 成员能够完好输出的原因。现在让我们再来看一个相同的实例,这次我们在同一时间只使用一个变量,这也演示了使用共用体的主要目的:
#include <stdio.h> #include <string.h> // 声明共用体 union Data { int i; float f; char str[ 20 ]; }; int main() { union Data data; data.i = 10; printf("i = %d \n", data.i); data.f = 10.2; printf("f = %f \n", data.f); strcpy(data.str, "C Programming"); printf("str = %s \n", data.str); // 结束main函数 return 0; }