免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-21 17:59 |只看该作者 |倒序浏览
int a[2];
int i;
a[-1]=100;
//printf("0x%x,0x%x\n",&a[-1],&i);
printf("i is %d\n",i);

这段代码打出来的i is 0
我把注释去掉:
int a[2];
int i;
a[-1]=100;
printf("0x%x,0x%x\n",&a[-1],&i);
printf("i is %d\n",i);

结果是a[-1]的地址和i的地址一样,然后i is 100.

谁能给我讲讲原理?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
2 [报告]
发表于 2011-04-21 18:04 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2011-04-21 18:06 |只看该作者
回复 2# c/unix


    刚才看到了一个数组负下标的帖子,然后随便做了个测试发现了这个奇怪的现象,求懂编译原理的人给个解释,纯粹的技术讨论,实际应用中代码肯定不会这么写。

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
4 [报告]
发表于 2011-04-21 18:57 |只看该作者
回复 3# kpuppy


    可能是编译器发现 a 根本就没有用到,给优化掉了。gcc -g -O0 试试吧。

论坛徽章:
1
双子座
日期:2014-08-29 17:15:03
5 [报告]
发表于 2011-04-21 19:07 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2011-04-21 19:13 |只看该作者
&a[-1] = &a[0]-1

论坛徽章:
0
7 [报告]
发表于 2011-04-21 19:16 |只看该作者
回复 4# nketc


    我试了结果还是一样的。因为已经对a赋值了,应该不会优化掉吧。

论坛徽章:
0
8 [报告]
发表于 2011-04-21 19:18 |只看该作者
&a[-1] = &a[0]-1
yang_crystal 发表于 2011-04-21 19:13



    32位机器上应该不是减1而是减4吧。问题是我不打印第一句,i的值就是0啊。

论坛徽章:
0
9 [报告]
发表于 2011-04-21 19:25 |只看该作者
回复 8# kpuppy

a是int类型的,减1就是sizeof(int)*1,也就是你指的4,
btw:你的程序本来就错了,不要期望一定得到你想要的结果

论坛徽章:
0
10 [报告]
发表于 2011-04-21 19:35 |只看该作者
回复  kpuppy

a是int类型的,减1就是sizeof(int)*1,也就是你指的4,
btw:你的程序本来就错了,不要期望 ...
yang_crystal 发表于 2011-04-21 19:25



     呃,首先,你说的是指针减1的时候才是减去sizeof(类型),但是&a[-1]和&a[0]本身就是两个地址,你可以把他们打出来看,我可以肯定差是4而不会是1。
   BTW:我3楼就说了,纯粹的技术讨论,我也没打算这么用代码,此问题仅供有兴趣的人讨论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP