我觉得联合体的优点从另一方面来讲就是缺点: 1、使用联合体可以节省空间. 有时我们需要一种类型即能保存整型数,又能保存浮点数. 这时如果定义成结构体类型, 如: typedef struct { int i; float f; } Number; 当使用该结构体来存储整型数或浮点数时,这样很明显会造成内存浪费。 同样的需求,如果用联合体来定义,如: typedef union { int i; float f; } Number; 定义一个联合体类型变量: Number u; 当需要保存整型数时,可以将整型数保存到联合体的i成员中, u.i = 10; 后面又需要保存浮点数时,可以写成: u.f = 70.8; 由于联合的成员重叠存储,那么当后面一条赋值语句执行完后,将抹去前面保存在联合体成员i里的值. 如果后面需要测试u.i的值,那么它会显示出无意义的内容.这样容易造成混淆. 2、使用联合可以用来构造混合的数据结构. 如用上面的联合体类型来定义一个数组, Number number_arr[100]; 这个数组中的元素既能保存整型数,用能保存浮点数. 由于联合体同一时间内只能保存一种类型的成员,因此没有简便的方法可以表明联合最后的成员,前面已经指出, 当联合体中元素类型不正确时,甚至会出现无意义的情况. 这个问题的一个解决方案是为结构添加一个标记字段, 结构中包含联合体, 如: typedef struct { int flag; union { int i; float f; } } Number; 当flag为0时,表示为联合体中保存的元素为整型数;flag=1时,表示联合中保存的为浮点数; 每次更新结构中联合元素保存的类型时,都需要更新结构体中的标记变量. 这样比一般的更新方式要多一步的操作。 同时,标记字段也需要占用空间,有时候这样做,可能会占浪费更多的空间. |