可能重复:
C语言中结构体和联合体的区别
我能理解什么是结构体。但是,我对联合体和结构体之间的区别有点困惑。联合体就像是一块内存共享。这到底是什么意思?
使用 union,所有成员共享相同的内存。使用 struct,则不共享内存,因此为结构的每个成员分配了不同的内存空间。
例如:
union foo
{
int x;
int y;
};
foo f;
f.x = 10;
printf("%d\n", f.y);
foo::x
。然后输出foo::y
的值,它也是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);
我使用联合体将字节转换为其他类型,我发现这比位移更容易。
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位(曾在微控制器上使用)。
一个union的每个成员共享同一块内存。这意味着如果你改变其中一个成员,其他成员也会随之改变。而且,如果成员是不同类型的,可能会产生不可预测的结果(虽然不完全是不可预测的,但除非你了解组成数据成员的底层位模式,否则很难预测)。
我认为可以这样理解union:它是一组不同类型的别名,指向同一个内存块。每个成员都是一个“别名”,具有特定的类型。每个别名都引用内存中相同的地址。如何解释该地址上的位由别名的类型确定。
union占用的内存量始终等于或可能大于union中最大大小的“成员”(由于对齐限制)。
case 1:
是非法的。此外,标识符 option1
等都是标签,因此您需要用 struct option1 *bar
进行声明。如果想要声明变量,可以在每个 case 标签后引入新的作用域。 - dreamlax这里的大多数答案都是正确的。联合体本质上是一种以不同方式访问相同数据的方法(例如,您可以将内存中的4个字节作为1个整数或4个字符来访问/解释)。正如您所知,结构体是直接的 - 一个包含不同、独立对象及其自己的内存的集合。
通常情况下,与结构体相比,您在编程的后期才需要使用联合体。
运行这个程序并找到输出。
#include < stdio.h >
int main() { union _testUnion { long long x; long long y; } testUnion;
struct _testStruct { long long x; long long y; }testStruct; printf("Union的大小为%d\n",sizeof(testUnion)); printf("Struct的大小为%d\n",sizeof(testStruct)); return; }
你会发现结构体的大小是联合体的两倍。这是因为联合体只为一个变量分配了空间,而结构体为两个变量分配了空间。
unsigned char
数组的其他成员”。 - Jens Gustedt