免费注册 查看新帖 |

Chinaunix

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

[C] 遇到一个很诡异的问题,求真相 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-22 22:29 |只看该作者 |倒序浏览
有这样一段代码:
typedef struct _T
{
     int a[4];
}T;

T ga;
T gb;

T A()
{
    return ga;
}
T B()
{
     return gb;
}
有这样一个判断
if((B().a[2] & 1) || (A().a[2] & 1))
两个全局变量的内存我都读出来过,都是0,按道理说这个if分支根本进不去的,但是在一个环境上会有低概率出现进入这个if分支的情况
特别诡异,如果把这两个函数直接替换成全局变量就永远不会进if分支,分析这个问题还是跟上面两个以结构体为返回值的函数有关系。
求大神帮忙分析一下究竟为什么会出现这种情况????函数返回的结构体是放到哪里的?会不会去读取数组的第三个值的时候出现访问到未知内容的情况??

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2014-03-22 23:18 |只看该作者
全局变量放在BSS段,这个段里面的内容会全部初始化为0,其他地方没有初始化,所以内存里的内容不确定。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 2014-03-23 10:08 |只看该作者
真象在汇编代码中……

论坛徽章:
0
4 [报告]
发表于 2014-03-23 13:17 |只看该作者
有可能是什么原因呢?回复 3# cobras


   

论坛徽章:
0
5 [报告]
发表于 2014-03-23 13:18 |只看该作者
不会越界啊回复 2# windoze


   

论坛徽章:
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
6 [报告]
发表于 2014-03-23 13:59 |只看该作者
略怪。。。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
7 [报告]
发表于 2014-03-23 21:08 |只看该作者
回复 4# 恒宇来啦

谁说越界了?问题在于内存没有初始化成0,里面原有什么内容是不确定。

论坛徽章:
0
8 [报告]
发表于 2014-03-23 22:59 |只看该作者
也有可能是返回值是结构体,在复制结构体内容的时候,没有复制。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
9 [报告]
发表于 2014-03-24 13:10 |只看该作者
全局变量在 BBS 段,初始化为什么值是未定义的,
static 全局变量才会真正初始化为0

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
10 [报告]
发表于 2014-03-24 14:03 |只看该作者
这个return的是个临时变量吧? 而且struct没有复制构造函数, 所以返回的内容并不是严格一致的(浅拷贝), 你可以改成T& A(). T& B()改成引用的函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP