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