如果我将 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/