String 作为 Union 的成员

String as a member of Union

我正在浏览这段代码来寻找答案。据我所知,在联合中每个成员的内存地址是相同的。在下面的代码中,如果有一个字符而不是字符串,那将很容易。但是现在我很困惑.... 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(对于最大 2,147,483,647 的正值)。所以,03 01 00 003 + 256*1,等于 259.