c语言中的共用体

Python013

c语言中的共用体,第1张

我测试了一下

int为32bit

,long为32位

,char为8位机测试。

分析得出这样的结果:

这正如共用结构体中

假如他们的共用首地址为0x10000000

那么

地址

变量

0x10000000:

a[0]

如果执行语句

s.a[0]=0x39

0x10000004:

a[1]

相差4个字节

那么会产生如下变化:

0x10000000:

b

a[0]=0x39

b[0]=0x39

c[0]=0x39(

字符c[0]="9")

0x10000000:

c[0]

如果再执行语句

s.a[1]=0x38

0x10000001:

c[1]

那么会产生如下变化:

0x10000002:

c[2]

a[1]=0x38

0x10000003:

c[3]

相差1个字节

也即是地址0x10000000到0x10000003中的数据为0x00000039

也即是地址0x10000004到0x10000007中的数据为0x00000038

虽然是共用体,但是a

b

c同用了一个地址

如果对a赋值了也同时对b和c赋值

只是数据类型不同而已。

如果从地址上来分析

c如果定义的是c[8],那么c[5]地址即为0x10000004

它的值就因该为0x38,因为和a[1]的地址相同。

查看b的是后可以直接用%d来查看

因为在本机上也是32bit和int相同

首先,你b前面是不是少东西了?我把它假设成是int做了。

先给这个共用体分配4个字节,两个短整型,一个长整型,四个字符型。赋给两个整型0039和0038(16进制),共用体分配字节,是从大到小,即或 39 00 38 00,s.b是长整型即00380039,即380039(16进制),s.c[0]是39(16进制) 换成10进制是57,再换成ASCII是9。

希望这个答案对你有所帮助!

这个实际上牵扯到数据在内存里的放置了

首先这个共用体一般来说是4个字节的,在little-endian的机器上结构,地址在从左到右递增大概是这样,当然每行是一个观测模式,实际上不会并存的

i[0]第一低位字节 i[0]第二低位字节 i[1]第一低位字节 i[2]第二低位字节

k第一低位字节k第二低位字节j第低位三字节k第四低位字节

c[0] c[1] c[2] c[3]

当进行这句赋值后s->i[0]=0x39s->i[1]=0x38

i[0]实际上是0x0039,在内存中0x39就到了i[0]的第一低位字节,而0x00就到了i[0]的第二低位字节

所以此时的c[0]也就成了0x39

说的很不清楚,因为这个和计算机体系结构有关了,没有预备知识确实不太好讲