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相同
十六进制的0x39表示的是十进制的57,而ASCII代码为57的值代表的是字符9,所以当printf以%c格式输出时,为字符'9',,而共用体长度为4,定义i[]数组时数据没有被覆盖,如果在s->i[0]=0x39s->i[1]=0x38后加上 s->k=70则输出为F,因为共用体的性质,s->c[0]的值变为70,而ASCII代码为70的值代表的是字符F,---------这样说清楚不?欢迎分享,转载请注明来源:内存溢出
评论列表(0条)