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/