使用union类型出现的程序结果不确定问题
来源:互联网 发布:校园网络诈骗案例 编辑:程序博客网 时间:2024/06/14 22:39
刚从论坛上看到一个问题:
#include <stdio.h>
int main(void)
{
union //共用体 所以不论什么时候只能有一个可以用
{
char i[2];
int k;
}r;
r.i[0]=0;
r.i[1]=2;
printf("%d /n", r.k); //没有赋值所以值是不确定的
return 0;
}程序结果是什么?
这里简单解释一下:
由于union类型是共享内存,也就是说字符数组i和int类型变量k共享这一内存的数据,因此同一时刻只能有一个变量有意义。
union类型变量r的大小是按其成员的最大内存长度分配的。根据编译器和机器位数的不同,上述程序会出现不同的结果:
(1)如果编译器对union型初始化默认为0,i中的i[0]和i[1]是按内存从低到高的顺序分配的。因此i要占用r的低位2个字节。
int型长度是16或32,即4个字节或8个字节,且,则上述r中内存的二进制形式为:
高位------------------------------------------------低位(16位)
00000000 00000000 00000010 00000000
r.i[1] r.i[0]
|--------------------------r.k------------------------------|
因此r.k=2^9=512;
(2)如果编译器对union型初始化没有默认值,i中的i[0]和i[1]是按内存从低到高的顺序分配的(i要占用r的低位2个字节),例如VC++6.0中,将r.k以以下16进制输出:
printf("%x/n",r.k);
输出结果为:-859045376(十进制输出)
cccc0200(16进制输出)可以看出:一个16进制位=4个二进制位,2个16进制位=1个字节,这里输出了4个字节,说明int型为32位的:
高位-----------------低位(16进制)
cc cc 02 00
r.i[1] r.i[0]
|--------------------------r.k------------------------------|
char i[]初始化时覆盖了内存的低位2个字节,但由于r初始化时内存没有默认为0,且r.k也没有初始化,因此其2个字节的高位数值是不确定的。
如果修改为以下程序:
#include <stdio.h>
int main(void)
{
union //共用体 所以不论什么时候只能有一个可以用
{
char i[2];
int k;
}r;
r.k=0; //先通过初始化r.k将union型变量r的内存清零
r.i[0]=0;
r.i[1]=2;printf("%d /n", r.k); //没有赋值所以值是不确定的
printf("%x/n",r.k);
return 0;
}其结果为:
512 (十进制)
200 (十六进制)可见,上述程序的结果其实与编译器对数据类型的默认初始化与数据在机器内存中的分配顺序(从低到高分配还是从高到低分配)是有关的。
- 使用union类型出现的程序结果不确定问题
- 一个"不确定"出现的问题
- MYsql的UNION使用 构造结果集
- union _ULARGE_INTEGER 的使用问题!
- 谈谈联合类型union的使用
- 关于使用thinkPHP3.2使用union会出现分页不对的问题
- 数组元素在使用前一定要初始化否则运行结果将是不确定的
- union组合结果集时的order问题
- C++可变长不确定类型的参数
- sublime解决使用快捷键Ctrl+B运行python程序只出现空白框但是却没有其他结果输出的问题
- union中使用类对象的问题
- mysql中UNION使用的问题 --乐杨俊
- 表union时出现的排序规则问题
- 一个分页排序SQL查询结果集不确定的案例
- 一个分页排序SQL查询结果集不确定的案例
- 输入数量不确定的[0,9]范围内的整数,统计每个数字出现的次数,输入-1时结束程序。
- Swift的类型推断会不会造成类型不确定的困扰?
- c# --- 泛型解决输入和输出类型不确定问题
- Qt操作excel类
- MPEG2 TS小结
- VS2010正式版破解方法
- ConnectString
- ghost版xp如何安装IIs
- 使用union类型出现的程序结果不确定问题
- 真希望永远用不到这些代码
- 在Eclipse中使用版本控制系统CVS(转)(二)
- 关于在 xmlSPY 出现的错误 DOCTYPE-EXternalID的名称必须既是SYSTEM 又是PUBLIC?
- 网站改灰色了
- JSF MVC 流程
- Google的快捷按钮之谜
- debian安装中文字体
- 中断处理的工作队列机制-原来如此