谁能告诉我这个是为什么?

发布于 2022-10-15 08:55:14 字数 388 浏览 52 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

哀由 2022-10-22 08:55:14

回复 2# c/unix

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

残花月 2022-10-22 08:55:14

回复 3# kpuppy

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

Hello爱情风 2022-10-22 08:55:14

&a[-1] = &a[0]-1

独守阴晴ぅ圆缺 2022-10-22 08:55:14

回复 4# nketc

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

昨迟人 2022-10-22 08:55:14

&a[-1] = &a[0]-1
yang_crystal 发表于 2011-04-21 19:13

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

潇烟暮雨 2022-10-22 08:55:14

回复 8# kpuppy

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

浅沫记忆 2022-10-22 08:55:14

回复  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楼就说了,纯粹的技术讨论,我也没打算这么用代码,此问题仅供有兴趣的人讨论。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文