【发布时间】:2018-04-24 16:52:04
【问题描述】:
在 union 中,所有元素都指向同一个内存槽。因此,如果我们将 int 视为 2 个字节,那么它包含二进制值 00000001 00000000(256)。由于char的大小是1字节,所以前半部分(1字节)应该分配00000001,后半部分应该分配00000000。但是为什么下面的代码打印256 0 1而不是256 1 0?
#include<stdio.h>
int main()
{
union a{
int i;
char ch[10];
};
union a u;
u.i=256;
printf("%d,%d,%d",u.i,u.ch[0],u.ch[1]);
return 0;
}
【问题讨论】:
-
这只是意味着你在Little Endian机器上运行它。
-
因为您使用的是 little-endian 系统(就像所有 x86 系统一样)?
-
因为
u.i是从联合的任何其他元素读取的活动成员是未定义的行为。一些编译器实现了扩展以允许这样做,您需要检查您是否已启用它们。见:en.cppreference.com/w/cpp/language/union -
@RichardCritten C 标准允许通过联合进行类型双关(尽管 C++ 不允许),以及使用
char *访问任何类型。 -
@RichardCritten 这取决于语言。在 C 中,允许使用联合进行类型双关。在 C++ 中,它是 not 允许的。所以应该真正指定真正使用什么语言。