免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13601 | 回复: 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++标准对这种情况是怎么描述的啊

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
14 [报告]
发表于 2012-10-29 13:49 |只看该作者
本帖最后由 lin5161678 于 2012-10-29 13:50 编辑

回复 13# FaintKnowledge

你弄错了 有初始化的时候 未指定的字节 不是设置为 NULL 而是 '\0' 或者说 0

论坛徽章:
0
13 [报告]
发表于 2012-10-29 13:18 |只看该作者
本帖最后由 FaintKnowledge 于 2012-10-29 13:33 编辑

回复 12# lin5161678


我说的垃圾值就是以%c打印的1了(你前面不是提到过了?我只是验证下,不是笑脸,是个方框,中间一个问号. ).


我说的垃圾值意思是:内存中不确定的值...
我开始的理解是,既然第一个位置被赋值了,后面的没有赋值,应该都是垃圾值吧?也应该都赋值给数组a[]才对...,比如:
  1. #include "stdio.h"
  2. #include "stdlib.h"

  3. main()
  4. {
  5.     char a[200];
  6.     printf("%s",a);
  7. }

  8. 输出结果是:

  9. [root@speedLinux phpcms]# ./a.out
  10. 蔀劮@淇
  11.         (淇t喎
复制代码
但是数组a[]的值都为NULL了


附加修改:
我测试了下,原因应该在这里了:myunion o = {1};除了第一个位置的,其他的都赋值为NULL;如果myunion o ={};这样就将第一个赋值为0(i和a[0]),其他的为NULL。如果单单只是:myunion o;内存中就会出现:
-1217015184
112
p
These are array a bellow
p

u





)

//除了第一个可以解释,其他的都是乱其八糟的了

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
12 [报告]
发表于 2012-10-29 12:54 |只看该作者
回复 11# FaintKnowledge
的确会被赋值为1 但是 你在#9提到的垃圾值是什么意思?

   

论坛徽章:
0
11 [报告]
发表于 2012-10-29 09:47 |只看该作者
回复 10# lin5161678


也不全是...a[0]确实是被赋值为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才能看见完整输出
   

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

   

论坛徽章:
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. 
复制代码

论坛徽章:
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去初始化第一个有名的成员变量
那为什么不去初始化内存最大的那个成员变量呢??
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP