C 中“union”和“struct”的主要区别是什么? [重复]

问题描述 投票:0回答:7

可能重复:
C 中结构和联合的区别

我能理解结构体的含义。但是,我对联合和结构之间的区别有点困惑。联盟就像是一段记忆。到底是什么意思。?

c++ c struct unions
7个回答
33
投票

通过工会,所有成员都共享相同的记忆。 对于结构体,它们不共享内存,因此内存中的不同空间被分配给结构体的每个成员。

例如:

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 上面的评论。 我向工会提供的示例仅用于演示目的。 实际上,您不应该写入联合的一个数据成员,然后访问另一个数据成员。 通常这只会导致编译器将位模式解释为另一种类型,但您可能会得到意想不到的结果,因为这样做是未定义的行为


12
投票

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 位(用于微控制器)。


5
投票


3
投票

联合占用的内存量始终等于或可能大于联合的最大尺寸“成员”(由于对齐限制)。


3
投票

结构选项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 编程和其他情况下非常常见,在这些情况下,人们希望创建一个可以接收多种不同类型消息(具有不同参数和布局要求)的函数。


2
投票

与结构相比,通常在编程的后期阶段需要使用联合。


1
投票

#包括

< stdio.h >int main() { 联合_testUnion { 长长x; 长长y; } 测试联盟; 结构体_testStruct { 长长x; 长长y; }测试结构; printf("联合大小%d “,sizeof(testUnion)); printf("结构体大小%d “,sizeof(testStruct)); 返回; }

你会发现struct的大小是union的两倍。这是因为 union 只为一个变量分配了空间,而 struct 为两个变量分配了空间。 

© www.soinside.com 2019 - 2024. All rights reserved.