gpt4 book ai didi

c - 结构和 union 之间的区别

转载 作者:太空狗 更新时间:2023-10-29 16:13:33 24 4
gpt4 key购买 nike

有什么很好的例子可以说明 structunion 之间的区别吗?基本上我知道 struct 使用其成员的所有内存,而 union 使用最大的成员内存空间。还有其他操作系统级别差异吗?

最佳答案

对于 union ,您应该只使用其中一个元素,因为它们都存储在同一位置。当您想要存储可能是多种类型之一的内容时,这非常有用。另一方面,结构体的每个元素都有一个单独的内存位置,并且它们都可以同时使用。

举一个具体的例子来说明它们的使用,不久前我正在研究一个 Scheme 解释器,我基本上是将 Scheme 数据类型叠加到 C 数据类型上。这涉及在结构中存储一个指示值类型的枚举和一个用于存储该值的 union 。

union foo {
int a; // can't use both a and b at once
char b;
} foo;

struct bar {
int a; // can use both a and b simultaneously
char b;
} bar;

union foo x;
x.a = 3; // OK
x.b = 'c'; // NO! this affects the value of x.a!

struct bar y;
y.a = 3; // OK
y.b = 'c'; // OK

编辑:如果您想知道将 x.b 设置为“c”是什么将 x.a 的值更改为,从技术上讲它是未定义的。在大多数现代机器上,一个 char 是 1 个字节,一个 int 是 4 个字节,所以给 x.b 值 'c' 也会给 x.a 的第一个字节同样的值:

union foo x;
x.a = 3;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);

打印

99, 99

为什么两个值相同?因为 int 3 的最后 3 个字节都是零,所以它也被读为 99。如果我们为 x.a 输入一个更大的数字,您会发现情况并非总是如此:

union foo x;
x.a = 387439;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);

打印

387427, 99

为了更仔细地查看实际内存值,让我们设置并打印出十六进制值:

union foo x;
x.a = 0xDEADBEEF;
x.b = 0x22;
printf("%x, %x\n", x.a, x.b);

打印

deadbe22, 22

您可以清楚地看到 0x22 在哪里覆盖了 0xEF。

但是

在 C 中,int 中的字节顺序未定义。此程序在我的 Mac 上用 0x22 覆盖了 0xEF,但在其他平台上它会覆盖 0xDE,因为顺序组成 int 的字节数被颠倒了。因此,在编写程序时,永远不要依赖 union 体中覆盖特定数据的行为,因为它不可移植。

有关字节顺序的更多阅读,请查看 endianness .

关于c - 结构和 union 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/346536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com