免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kpuppy
打印 上一主题 下一主题

[C] 谁能告诉我这个是为什么? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-04-23 22:38 |只看该作者
这个不对
pmerofc 发表于 2011-04-23 22:34

愿闻其详

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
22 [报告]
发表于 2011-04-23 23:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
23 [报告]
发表于 2011-04-25 01:12 |只看该作者
我猜下,要看内存怎么分配的了,可能a[-1]使用的内存空间刚好是i存放值的地方。

论坛徽章:
0
24 [报告]
发表于 2011-04-25 01:23 |只看该作者
我刚才试了一下,不一样

  1. 0xbfeda554,0xbfeda560
  2. i=-1217103952
复制代码

论坛徽章:
0
25 [报告]
发表于 2011-04-25 01:31 |只看该作者
本帖最后由 duwei211 于 2011-04-25 01:37 编辑

我运行的结果
  1. &a[-1]=0xbfdbdb84,&i=0xbfdbdb90
  2. &a[0]=0xbfdbdb88
  3. i=-1216362576
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
26 [报告]
发表于 2011-04-25 13:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
27 [报告]
发表于 2011-04-25 15:30 |只看该作者
本帖最后由 cokeboL 于 2011-04-25 17:15 编辑
未定义行为
和 i ++   +  i ++  问题的性质一样
KBTiller 发表于 2011-04-22 08:49



    个人觉得这个不算吧。//仔细想想,确实应该是,因为代码中确实不该有这种形式出现,都该是未定义行为。

   但对这个问题的结果,a[-1] 对应的解引用操作也就相当于 *(a-1),也就是数组a前面那个int。

   至于为什么和 i 的地址相等,这个要看linu内存的格式了吧。可以参考APUE大概第七章那个图:

                      -------------------
                           |                |
                           |                |
                           --------------
                 低地址 |                |  堆
                           |                |               
                           |                |
                           |                |  int  i
                           |                |  int a[2]
                           |                |
                 高地址 ---------------  栈

    int数组a和int型 i 属局部变量,都在栈空间分配,压栈分配时地址是由高到低分配的,也就是说先分配了数组a,a在高地址,接下来 分配了 i, 中间未分配其他,那么 i 应该在 a 的地址前面挨着,如图,所以 i 的地址正好为a-1,运行结果正常。

    当然,如果情况比较复杂就得看具体问题了。

    我觉得这种做法应该算数组越界的一种,同样可以导致数据脏吧~

    一点拙见,不知道对不对。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
28 [报告]
发表于 2011-04-25 15:39 |只看该作者
这个不对
pmerofc 发表于 2011-04-23 22:34



    我觉得这种写法是不该有的,但是针对这个问题这个解释应该是正确的吧

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
29 [报告]
发表于 2011-04-25 16:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
30 [报告]
发表于 2011-04-25 17:14 |只看该作者
你能否用27楼的理论解释一下这个么
   ( (int *)0 ) [ - 1 ]
pmerofc 发表于 2011-04-25 16:41



    不能解释。27楼是针对LZ的问题解释为什么&a[-1] = &i。

   [(int*)0)[-1] 的话,用户空间的0地址本身貌似是不可读不可写吧?-1地址应该是没有的。
   如果是硬件操作的话,记不清在哪瞟过一眼,有些设备确实是有负地址的,那样的话还是能取到,但做法依然应该是属于未定义那一类(这个我改过看法)。

   最近刚开始学和看帖子,而且没记牢,忘记了是在哪找,您给讲解一下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP