C中“union”和“struct”之间的主要区别是什么?
可能重复:
C中结构与联盟的区别
我能理解结构意味着什么。 但是,我对union和struct之间的区别感到困惑。 联盟就像是记忆的一部分。 究竟是什么意思。
通过联合,所有成员共享相同的内存。 使用结构,它们不共享内存,因此内存中的不同空间被分配给结构的每个成员。
例如:
union foo { int x; int y; }; foo f; fx = 10; printf("%d\n", fy);
在这里,我们将值10赋给foo::x
。 然后我们输出foo::y
的值,它也是 10,因为x和y共享相同的内存。 请注意,由于联合的所有成员共享相同的内存,因此编译器必须分配足够的内存以适合联合的最大成员。 因此,包含char
和long
将需要足够的空间来适应long
。
但是如果我们使用结构:
struct foo { int x; int y; }; foo f; fx = 10; fy = 20; printf("%d %d\n", fx, fy);
我们将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位(用于微控制器)。
联盟的每个成员共享相同的内存。 这意味着如果你换一个,你就改变了其他的。 如果成员的类型不同,这可能会产生不可预测的结果。 (不完全不可预测,但很难预测,除非您了解构成数据成员的基础位模式)。
对于这有什么好处,有一个未经证实的例子可能更有用。 (我说“没有被动”,因为联盟的大多数使用都是非常危险的。从big-endian到little-endian硬件的爆炸工会以最(最初)神秘的方式打破了。)(当然,我已经写入比特冲突的联合会撕掉浮点数来实现数量级比图书馆数学运算更快的速度。我只是添加关于哪些成员应该具有相同地址的断言。)
struct option1 {int type; /* 其他成员 */ }; struct option2 {int type; /* 其他成员 */ }; struct option3 {int type; /* 其他成员 */ }; 工会组合{ int类型; //保证与结构的int类型完全重叠。 struct option1; struct option2; struct option3; }; // ... void foo(union combo * in){ switch(in.type){ 案例1:{struct option1 * bar = in; //然后处理option1类型的请求} 案例2:{struct option2 * bar = in; //然后处理option2类型的请求} 案例3:{struct option3 * bar = in; //然后处理option3类型的请求} }
这种结构在X编程和其他希望创建可以接收许多不同类型的消息(具有不同的参数和布局要求)的函数的情况下非常常见。
我想你可以想到一个联合的一种方式是它是一组不同类型的别名到一个内存块,其中联合的每个成员都是一个给定类型的“别名”。 每个别名都指向内存中的相同地址。 如何解释该地址的位由别名’type确定。
联合占用的内存量总是等于或可能大于联合的最大大小的“成员”(由于对齐限制)。
运行此程序并找出输出。
#include
int main() { union _testUnion { 长x; 很久很久 } testUnion; struct _testStruct { 长x; 很久很久 } testStruct; printf(“Sizeof Union%d \ n”,sizeof(testUnion)); printf(“Sizeof Struct%d \ n”,sizeof(testStruct)); 返回; }
你会发现struct的大小是union的两倍。 这是因为union已经为一个变量分配了空间,而struct已经分配了两个变量。
这里的大多数答案是正确的 联合本质上是一种以不同方式访问相同数据的方法(例如,您可以将4个字节的内存作为1个整数或4个字符进行访问/解释)。 你知道的结构是直截了当的 – 一组具有自己记忆的不同的,独立的对象。
通常,与Structs相比,您需要在编程的后期阶段使用Unions。