c - 如果 union 的格式不同,C 如何解释来自 union 的数据?

标签 c memory struct unions

main()
{
union{
    char i[2];
    struct{
        short age;
    } myStruct;
} myUnion;
myUnion.i[0] = 'A';
myUnion.i[1] = 'B';
printf("%x ", myUnion.myStruct.age);

} 

所以我知道 union 只包含其中最大成员的空间 - 在这种情况下,字符数组“i”和结构“myStruct”似乎是相同的,所以 union 只有两个字节包含字符“A”和“B”。但是,如果您此时尝试读取结构成员“age”,会发生什么情况?

最佳答案

在过去,这曾经是“未定义的行为”,理论上可能会使您的系统崩溃或更糟。然而,程序员还是这样做了,并且在 C99 中进行了编纂(参见 Is type-punning through a union unspecified in C99, and has it become specified in C11? ),它允许您这样做但没有说明结果是什么或它们是否有意义。

所以,

  • 在现代的 8 位字节 16 位短小端系统上,它将打印 4241,

  • 在现代的 8 位字节 16 位短 big-endian 系统上,它将打印 4142,

  • 如果 sizeof(short) > 2 那么你就有问题了,因为 age 未初始化(但这些系统非常罕见),

  • 您将在 EBCDIC(您不使用或不关心)上得到不同的结果,

  • 您将在非 8 位字节系统(您不使用或不关心)上得到不同的结果,

  • 如果您的程序为 short 创建陷阱表示,您可以调用未定义的行为...但是,现代系统没有整数的陷阱表示。

关于c - 如果 union 的格式不同,C 如何解释来自 union 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29423481/

相关文章:

java - 可变参数堆污染 : what's the big deal?

java - java内存不足时写入磁盘

用于填充结构字段的 C 预处理器宏

c++ - 在 C++ 中计算任何结构的简单方法

ios - 从结构而不是数组填充 TableView

c - 函数采用结构体的 void 指针,并将指向其成员的指针传递给另一个函数

c - AES EVP_Decrypt的 "length"参数是什么?

c - 如何从头开始用 C 语言播放声音 (Linux)

c++ - 目录大小

c - 不使用 "mmap"调用将物理内存映射到用户虚拟地址空间的替代方法