我正在遍历这段代码以找到答案。据我所知,每个成员的内存地址是相同的。在下面的代码中,如果有一个字符而不是字符串,那将很容易。但是现在我很困惑.... i=259
的值如何?
#include<stdio.h>
int main()
{
union cq1
{
int i;
char ch[2];
};
union cq1 u1;
u1.ch[0]=3;
u1.ch[1]=1;
printf("%d %d %d", u1.ch[0], u1.ch[1], u1.i);
return 0;
}
char ch[2]
之类的字符数组是2个char
的数组,每个1字节长。这意味着在内存中,它是char
,然后是第二个char
。
此联合包含2种类型,一个32位(在我的机器上)整数和2个字符的数组。由于最大类型为32位或4个字节,因此联合的总大小为4个字节。您可以使用printf("%d\r\n", sizeof(u1));
ui1.ch[0] = 3
将第一个字节设置为3,而u1.ch[1] = 1
将第二个字节设置为1。当我在调试器中查看时,看到了0x60fefc: 03 01 00 00
。也就是说,在与u1
相对应的存储位置处有字节3、1、0和0。 u1.i
将其解释为以最低有效字节(LSB)顺序的4字节整数。 LSB格式的4字节整数以A B C D
格式表示在内存中,其中值为A + 256*B + 65536*C + 16777216*D
。因此,03 01 00 00
是3 + 256*1
,等于259
。