免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13597 | 回复: 13
打印 上一主题 下一主题

[C++] 请教一个union初始化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-26 11:53 |只看该作者 |倒序浏览
union myunion
{
int i;
char a[100];
}myunion;

然后在初始化的时候
myunion o = {1};
那么myunion的i就初始化成1
但是a有100个字节,那么剩下的96个字节被初始化成什么值了吗
C++标准对这种情况是怎么描述的啊

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-26 11:56 |只看该作者
未定义。。。。。

论坛徽章:
0
3 [报告]
发表于 2012-10-26 12:04 |只看该作者
vs 2010 上 测试 是0x00
用 o.i=1;赋值,o.a不赋值时,是 0xCC

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
4 [报告]
发表于 2012-10-26 12:41 |只看该作者
回复 3# wenlq

用初始化 不要用赋值
   

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
5 [报告]
发表于 2012-10-26 12:52 |只看该作者
回复 2# linux_c_py_php
应该只是 数组前面 一个int 长度的内容无法确定
不过 除了那个int以外的字节都应该是0的

   

论坛徽章:
0
6 [报告]
发表于 2012-10-26 14:30 |只看该作者
就是在C++ ISO2003标准中有这么一个规则:
To zero-initialize an object of type Tmeans:
—  if Tis a scalar type (3.9), the object is set to the value of 0(zero) converted to T;
—  if  T is  a  non-union  class  type,  each  nonstatic  data  member  and  each  base-class  subobject  is  zero-
initialized;
—  if Tis a union type, the object’s first named data member
89)
is zero-initialized;

如果是一个联合体类型,将会用0去初始化第一个有名的成员变量
那为什么不去初始化内存最大的那个成员变量呢??

论坛徽章:
0
7 [报告]
发表于 2012-10-26 16:50 |只看该作者
本帖最后由 FaintKnowledge 于 2012-10-26 17:04 编辑

回复 1# yellowweng

union维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间
union 是让对象共享相同的起始内存地址,同一时间只能储存其中一个数据成员,
引自:http://see.xidian.edu.cn/cpp/html/450.html  //这里也有比较详细的解释...
这里初始化对象为o,o中又有对象i和a[];所以只是初始化i,而a初始化也只初始化第一个a[0],其它则是使用内存中的垃圾值。
lz可以测试下,我的测试代码(C):
  1. ##include "stdio.h"
  2. #include "stdlib.h"

  3. union myunion
  4. {
  5. int i;
  6. char a[500];
  7. }myunion;

  8. main()
  9. {
  10. union myunion o = {1};
  11. int j;
  12. printf("%d\n",o.i);
  13. printf("These are array a bellow\n");
  14. for(j=0;j<=499;j++)
  15. printf("%c\n",o.a[j]);
  16. }
复制代码
结果:
  1. 1
  2. These are array a bellow
  3. [这地方有个乱码]  //初始化的应该是a[0]








  4. ...//自己添加的,呵呵,我的内存挺干净的.//当天也可能是union初始化的时候把所有的初始化为NULL了...我再试试
  5. 
复制代码

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
8 [报告]
发表于 2012-10-26 17:20 |只看该作者
回复 7# FaintKnowledge
你用 %c 输出0了 注意 不是字符'0' 是ascii码0的那个0
然后你所谓的乱码估计是 ascii码的1了
都是不可显示字符 你想说明什么

   

论坛徽章:
0
9 [报告]
发表于 2012-10-27 00:49 |只看该作者
本帖最后由 FaintKnowledge 于 2012-10-27 00:51 编辑

回复 8# lin5161678


    开什么玩笑阿?我哪儿用%c输出0了?命名是a[0],我的意思是i赋值为1,那么a[0]也会赋值,但赋的值是个垃圾值,数组a中第一个a[0]必须赋值
使用gdb调试的时候也是i也是1,怎么可能这么巧呢?

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
10 [报告]
发表于 2012-10-27 06:39 |只看该作者
回复 9# FaintKnowledge
你看清楚你在代码
  1. for(j=0;j<=499;j++)

  2. printf("%c\n",o.a[j]);
复制代码
然后你是给 o.i赋值为1
在这里 内存中的值会是
0x01 0x00 0x00 0x00[涉及大小端 但大小端不是重点 先忽略]
你输出o.a[0]其实是 输出 1  
ascii码为1 是一个不可显示字符 结果 有的是笑脸 有的是你所谓的乱码
其实 你用%d输出就能看清楚了
再一个就是 控制台默认只能输出300 你这里每一行都是用\n
太多行了 有一部分被挤出去了
[你想想你是不是有一句 printf("These are array a bellow\n"); 输出没看见了]
把 \n 换成 \t才能看见完整输出
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP