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

标签 c unions

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

相关文章:

c - 使用指针指向多个结构并访问结构数据成员

c++ - 在 C++03 中通过 int 传输 double 是否安全?

c - 同时访问一个 c union 的不同成员

c - 如何为嵌入在结构中的 union 的特定成员可移植地分配空间

c - 按值传递指针或按引用传递指针是否相同

iphone - Objective-C 及其与 C 的关系

c - 错误: ‘string’ undeclared (first use in this function) gcc OS X

c - Windows 控制台应用程序 - 关闭事件的信号

c - union 元素对齐

c - 关于 Union 的未使用字段