gpt4 book ai didi

c - 如何知道使用了 Union 中的哪个变量?

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

如果我将 union 声明为:

union TestUnion
{
struct
{
unsigned int Num;
unsigned char Name[5];
}TestStruct;
unsigned char Total[7];
};

现在,我怎么知道是使用了 Total[7] 还是使用了 TestStruct?

我正在使用 C!我正在重新审视 union 和结构,我想到了这个问题。不能使用“sizeof”,因为两者大小相同,即 7 个​​字节。 (还有另一个问题)

当我只用字符“a”填充“Total”并尝试 sizeof(TestUnionInstance) 时,它返回 12(Char 的大小是 1 个字节,对吗?)。所以我从中分离出结构体,发现Size of Structure是12字节而不是5+2=7字节....奇怪!!谁能解释一下??

附言我正在使用 Visual Studio 2008。

最佳答案

你不能。这是 union 的一部分。

如果你需要能够分辨,你可以使用一种叫做标记 union 的东西。有些语言内置了对这些的支持,但在 C 中,你必须自己做。这个想法是在 union 中包含一个标签,您可以使用它来判断它是哪个版本。喜欢:

enum TestUnionTag {NUM_NAME, TOTAL};

struct {
enum TestUnionTag tag;
union {
struct {
unsigned int Num;
unsigned char Name[5];
} TestStruct;
unsigned char Total[7];
} value;
} TestUnion;

然后在您的代码中,您确保始终设置标记以说明 union 的使用方式。

关于 sizeof:struct 是 12 个字节,因为 int 有 4 个字节(大多数现代编译器有 4 个字节的 int,与 long int 相同),然后是三个字节的填充和五个字节的字符(我不知道填充是在字符之前还是之后)。填充在那里,因此结构的长度是整数个单词,因此内存中的所有内容都在单词边界上保持对齐。因为结构体有 12 个字节长,所以 union 体必须有 12 个字节长才能容纳它; union 不会根据其中的内容改变大小。

关于c - 如何知道使用了 Union 中的哪个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194506/

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