通过工会,所有成员都共享相同的记忆。 对于结构体,它们不共享内存,因此内存中的不同空间被分配给结构体的每个成员。
例如:
union foo
{
int x;
int y;
};
foo f;
f.x = 10;
printf("%d\n", f.y);
这里,我们将值 10 分配给
foo::x
。 然后我们输出 foo::y
的值,即 also 10,因为 x 和 y 共享相同的内存。 请注意,由于联合体的所有成员共享相同的内存,因此编译器必须分配足够的内存来容纳联合体的“最大”成员。 因此,包含 char
和 long
的并集需要足够的空间来容纳 long
。但是如果我们使用结构体:
struct foo
{
int x;
int y;
};
foo f;
f.x = 10;
f.y = 20;
printf("%d %d\n", f.x, f.y);
我们将 10 分配给 x,将 20 分配给 y,然后将它们都打印出来。 我们看到 x 是 10,y 是 20,因为 x 和 y 不共享相同的内存。编辑:
另请注意 Gman 上面的评论。 我向工会提供的示例仅用于演示目的。 实际上,您不应该写入联合的一个数据成员,然后访问另一个数据成员。 通常这只会导致编译器将位模式解释为另一种类型,但您可能会得到意想不到的结果,因为这样做是未定义的行为。
union intConverter {
int intValue;
struct {
byte hi;
byte lo;
} byteValue;
}
intConverter cv;
cv.intValue =1100;
printf("%X %X\n", cv.byteValue.hi, cv.byteValue.lo);
其中 int 是 16 位(用于微控制器)。
联合占用的内存量始终等于或可能大于联合的最大尺寸“成员”(由于对齐限制)。
结构选项1 { int 类型; /* 其他成员 */ }; struct option2 { int 类型; /* 其他成员 */ }; struct option3 { int 类型; /* 其他成员 */ }; 联合组合{ int 类型; // 保证与结构体的 ints 类型完全重叠。 结构选项1; 结构选项2; 结构选项3; }; // ... void foo(联合组合 *in) { 开关(in.type){ 情况 1: { struct option1 *bar = in; //然后处理option1类型的请求 } 情况 2: { struct option2 *bar = in; //然后处理 option2 类型的请求 } 情况 3: { struct option3 *bar = in; //然后处理 option3 类型的请求 } }
这种构造在 X 编程和其他情况下非常常见,在这些情况下,人们希望创建一个可以接收多种不同类型消息(具有不同参数和布局要求)的函数。
与结构相比,通常在编程的后期阶段需要使用联合。
#包括
< stdio.h >int main() { 联合_testUnion { 长长x; 长长y; } 测试联盟; 结构体_testStruct { 长长x; 长长y; }测试结构; printf("联合大小%d “,sizeof(testUnion)); printf("结构体大小%d “,sizeof(testStruct)); 返回; }
你会发现struct的大小是union的两倍。这是因为 union 只为一个变量分配了空间,而 struct 为两个变量分配了空间。