联合体数据成员的疑问
联合体中所有成员都是共用一段存储空间的,结构体的长度为结构体成员中最长的那个数据成员的长度,我写了如下测试实例:
为什么会这样呢,我有这样一个疑问:
char是一个字节,int是四个字节的,char扩展到int的话,也不应该是把高三个字节中的每两个4位的高两位置1啊,希望朋友解答。 联合体
[解决办法]
本应该是这样,你给char型的变量赋值,它只用了四字节里的第一字节,其余三字节都没有使用,用char类型的变量读取时,刚好读了一字节的内容,没问题,但是用int型的变量读取时,是解析了内存里的四字节,其中有三字节都是没有初始化的。
[解决办法]
补充一下,在VS的debug环境下,内存都会自动初始化为 0XCCCCCCCC, 0x01CCCCCC为小端模式下的情况,换成值就是 0XCCCCCC01
[解决办法]
这个楼主自己结合union资料, union的空间大小(此处是4),和大端小端。
楼主的机器应该是小端。
[解决办法]
你所看到的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
[解决办法]
晕呀,你怎么计算的,11001100 11001100 11001100 是三个字节,11001100是CC,不是C0C0,一个十六进制数要占四位二进制数
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。