谁能告诉我这个是为什么?
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.
谁能给我讲讲原理?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
回复 2# c/unix
刚才看到了一个数组负下标的帖子,然后随便做了个测试发现了这个奇怪的现象,求懂编译原理的人给个解释,纯粹的技术讨论,实际应用中代码肯定不会这么写。
回复 3# kpuppy
可能是编译器发现 a 根本就没有用到,给优化掉了。gcc -g -O0 试试吧。
&a[-1] = &a[0]-1
回复 4# nketc
我试了结果还是一样的。因为已经对a赋值了,应该不会优化掉吧。
32位机器上应该不是减1而是减4吧。问题是我不打印第一句,i的值就是0啊。
回复 8# kpuppy
a是int类型的,减1就是sizeof(int)*1,也就是你指的4,
btw:你的程序本来就错了,不要期望一定得到你想要的结果
呃,首先,你说的是指针减1的时候才是减去sizeof(类型),但是&a[-1]和&a[0]本身就是两个地址,你可以把他们打出来看,我可以肯定差是4而不会是1。
BTW:我3楼就说了,纯粹的技术讨论,我也没打算这么用代码,此问题仅供有兴趣的人讨论。