我为这个节目输出了0 2 .....
但不知道为什么?
请解释我认为只有int i用512初始化
但ch [1]如何得到值2。
#include <stdio.h>
int main()
{
union a /* declared */
{
int i; char ch[2];
};
union a z = { 512 };
printf("%d%d", z.ch[0], z.ch[1]);
return 0;
}
答案 0 :(得分:4)
Union声明表示其所有成员都分配了相同的内存。因此,您的int i
和char ch[2]
引用了相同的内存空间 - 换句话说,它们是别名。每当你换一个,你也会改变另一个。
现在,假设您的int
是32位宽并且您使用的是像x86这样的小端系统,i = 512
(512 == 0x00000200)实际上在内存中看起来像这样:< / p>
0x00 0x02 0x00 0x00.
前两个值直接对应于2个字符的数组:
ch[0] ch[1]
所以你得到ch[0] == 0x0
和ch[1] == 0x02
。
尝试设置i = 0x1234
并查看它对角色阵列的影响。
根据您的问题,您可能想要使用struct
而不是union
- 然后其成员将按顺序分配在内存中(一个接一个)。
答案 1 :(得分:3)
512是十六进制的0x200,所以你的联合的第一个字节是0,第二个是2.如果你没有指定应该初始化哪个联合成员,那么将采用第一个,你的int
你的字符串的第二个字节得到2,因为ch
的第一个字节初始化为0,第二个字节为2。
答案 2 :(得分:1)
简单:512 =二进制1000000000,因此ch [0]将获得8个零(假设您的系统是小端)并且ch [1]将获得10个部分,其中十进制为2。
答案 3 :(得分:1)
你将'struct'与'union'混合在一起。在union中,您可以将不同类型和命名的数据收集到一个字段中(lenght = maximum(数据大小)),您可以访问该字段,并确保自己获得正确的数据。
你的例子为max(int,char [2])分配内存 如果你说z.i = 32或z.ch [0] =''
,这没什么区别答案 4 :(得分:0)
你有0 2
有充分的理由,但C标准说没有定义行为。如果你写i
,那么ch
的值在理论上可以是任何东西。
然而,gcc确保数据将很好地对齐。