首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

联合体数据成员的疑点

2013-01-22 
联合体数据成员的疑问联合体中所有成员都是共用一段存储空间的,结构体的长度为结构体成员中最长的那个数据

联合体数据成员的疑问
    联合体中所有成员都是共用一段存储空间的,结构体的长度为结构体成员中最长的那个数据成员的长度,我写了如下测试实例:



为什么会这样呢,我有这样一个疑问:
char是一个字节,int是四个字节的,char扩展到int的话,也不应该是把高三个字节中的每两个4位的高两位置1啊,希望朋友解答。 联合体
[解决办法]
本应该是这样,你给char型的变量赋值,它只用了四字节里的第一字节,其余三字节都没有使用,用char类型的变量读取时,刚好读了一字节的内容,没问题,但是用int型的变量读取时,是解析了内存里的四字节,其中有三字节都是没有初始化的。
[解决办法]
引用:
引用:
你sizeof一下看看结构体是多大size! 有内存对齐的啊!
额,看错了,原来是联合

楼主这个应该是大小端的问题 -- debug下内存为0x01CCCCCC

补充一下,在VS的debug环境下,内存都会自动初始化为 0XCCCCCCCC, 0x01CCCCCC为小端模式下的情况,换成值就是 0XCCCCCC01
[解决办法]
这个楼主自己结合union资料, union的空间大小(此处是4),和大端小端。
楼主的机器应该是小端。
[解决办法]
引用:
本应该是这样,你给char型的变量赋值,它只用了四字节里的第一字节,其余三字节都没有使用,用char类型的变量读取时,刚好读了一字节的内容,没问题,但是用int型的变量读取时,是解析了内存里的四字节,其中有三字节都是没有初始化的。

你所看到的CC,并不是你的程序置的,而是你的编译器里的未初始化的一块内存区域里的默认值
[解决办法]
正如你所说的,该共用体的长度是双字长度即是共用体成员int c的所占用字节长度。在未赋初值时a, b, c的值是随机的,因为不同的编译器对于不同数据类型对其随机值有不同的赋值。

在VC6.0下一般对对于未赋初值整型变量赋值为-858993460,其二进制为11001100110011001100110011001100。

在你的验证程序中你对共用体成员a赋值为1,a为字符类型,只占有一个字节,所以该赋值只影响了共用体的低字节(对于小端模式)。因为c初值为-858993460,第一个字节被改变为1后,其值也相应的变为-858993663,二进制形式为11001100110011001100110000000001,也就是你得到的结果。
[解决办法]
楼主是用的什么编译器,我在gcc-4.3.4下面运行,aa.c =1
[解决办法]
引用:
引用:
本应该是这样,你给char型的变量赋值,它只用了四字节里的第一字节,其余三字节都没有使用,用char类型的变量读取时,刚好读了一字节的内容,没问题,但是用int型的变量读取时,是解析了内存里的四字节,其中有三字节都是没有初始化的。

那没初始化的那三个字节为什么都是 1100 1100   1100 1100   1100 1100这样子的啊,这算是默……

晕呀,你怎么计算的,11001100   11001100   11001100 是三个字节,11001100是CC,不是C0C0,一个十六进制数要占四位二进制数
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

热点排行