如果联合的格式不同,C 如何解释来自联合的数据?
How does C interpret data from a union if it's formatted differently?
main()
{
union{
char i[2];
struct{
short age;
} myStruct;
} myUnion;
myUnion.i[0] = 'A';
myUnion.i[1] = 'B';
printf("%x ", myUnion.myStruct.age);
}
所以我知道联合只包含其中最大成员的 space - 在这种情况下,char 数组 "i" 和结构 "myStruct" 似乎是相同,所以联合只有两个字节包含字符 'A' 和 'B'。但是,如果此时您尝试读取结构成员 "age" 会发生什么情况?
在过去的日子里,这曾经是 "undefined behavior" 并且理论上可能会使您的系统崩溃或更糟。然而,程序员还是这样做了,并且在 C99 中进行了编纂(参见 Is type-punning through a union unspecified in C99, and has it become specified in C11?),它允许您这样做但没有说明结果是什么或它们是否有意义。
所以,
在现代的 8 位字节 16 位短小端系统上它将打印 4241
,
在现代的 8 位字节 16 位短大端系统上,它将打印 4142
、
如果sizeof(short) > 2
那么你有问题,因为age
是未初始化的(但是这些系统很少见),
您将在 EBCDIC(您不使用或不关心)上得到不同的结果,
您将在非 8 位字节系统(您不使用或不关心)上得到不同的结果,
如果您的程序为 short
...创建陷阱表示,您可以调用未定义的行为...但是,现代系统没有整数的陷阱表示。
main()
{
union{
char i[2];
struct{
short age;
} myStruct;
} myUnion;
myUnion.i[0] = 'A';
myUnion.i[1] = 'B';
printf("%x ", myUnion.myStruct.age);
}
所以我知道联合只包含其中最大成员的 space - 在这种情况下,char 数组 "i" 和结构 "myStruct" 似乎是相同,所以联合只有两个字节包含字符 'A' 和 'B'。但是,如果此时您尝试读取结构成员 "age" 会发生什么情况?
在过去的日子里,这曾经是 "undefined behavior" 并且理论上可能会使您的系统崩溃或更糟。然而,程序员还是这样做了,并且在 C99 中进行了编纂(参见 Is type-punning through a union unspecified in C99, and has it become specified in C11?),它允许您这样做但没有说明结果是什么或它们是否有意义。
所以,
在现代的 8 位字节 16 位短小端系统上它将打印
4241
,在现代的 8 位字节 16 位短大端系统上,它将打印
4142
、如果
sizeof(short) > 2
那么你有问题,因为age
是未初始化的(但是这些系统很少见),您将在 EBCDIC(您不使用或不关心)上得到不同的结果,
您将在非 8 位字节系统(您不使用或不关心)上得到不同的结果,
如果您的程序为
short
...创建陷阱表示,您可以调用未定义的行为...但是,现代系统没有整数的陷阱表示。