惊现vc6调试bug

程序员牛哥 2011-01-11 11:59:49
这几天重新复习了一下指针,无意中发现vc6一调试bug
看下面这段程序
#include<stdio.h>

void main() {

int a[3][3] = {1,2,3,4,5,6,7,8,9};
printf("%x\n",&a);
printf("%x",&a+1);
}

int a[3][3]={1,2,3,4,5,6,7,8,9},&a其值是数组的首地址不是数组首元素的首地址(虽然它和首元素的首地址相同),&a的类型是int (*)[3[3],所以当&a+n时,实际是按照&a(计算的过程中把&a认为是地址值,是个无符号整型变量啦,不再考虑它的类型啦)+n*sizeof(a),来得到的新地址(也是无符号整型变量),这个新地址肯定是数组a的界外,计算结果的类型还是 int (*)[3][3]。其中sizeof(a)是代表数组占的内存大小(就是数组a所有元素占的总字节数)。

对指针稍微有点理解的朋友就知道结果:

没错结果是:

12ff24 (&a)

12ff48 (&a+1)


即12ff24+1*36

当我在调试时意外的发现:

二话不说附图:


这里的&a+1的地址值只加了1

我思考这个问题:&a+1即为(&a)+1,注意:&(a+1)不是左值,无法进行显示


最后在vs2008测试,微软修正了这个问题:



...全文
382 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员牛哥 2011-01-17
  • 打赏
  • 举报
回复
感谢15L的兄弟,c语言深度剖析那本书收下了,呵呵!
大家对于这个问题有什么新的见解也欢迎联系我
email:pengfeicfan@163.com
艾莎云 2011-01-16
  • 打赏
  • 举报
回复
&a+1 为什么不是 (&a)+1? 难道是&(a+1)?
失散糖 2011-01-16
  • 打赏
  • 举报
回复
强悍啊
Qyee 2011-01-16
  • 打赏
  • 举报
回复
lz说的 bug 昨天刚好调试了。确实是个bug。地址肯定是有问题的。。

#include <stdio.h>

intmain()

{

int a[5]={1,2,3,4,5};

int *ptr1=(int *)(&a+1);

int *ptr2=(int *)((int)a+1);

printf("%x,%x",ptr1[-1],*ptr2);

return 0;

}
可以验证
Qyee 2011-01-16
  • 打赏
  • 举报
回复
lz 这个 &a+1
看过别人 和大小端问题联系了起来。也没看明白

一直不明白 &a+1 为什么是 &a + sizeof(a)*n
  • 打赏
  • 举报
回复
AnYidan 2011-01-16
  • 打赏
  • 举报
回复
lz 可以将a 改为指针试试
程序员牛哥 2011-01-16
  • 打赏
  • 举报
回复
马上结贴,还是没有令我信服的答案,sizeof(&a)也同样出现这个问题,大家可以在vc6与vs208试试!
wizard_tiger 2011-01-16
  • 打赏
  • 举报
回复
是不是应该这样
&(a+1)
ttssrs 2011-01-16
  • 打赏
  • 举报
回复
既然调试时是错的,为什么打印的结果却是对的呢?
抬头看路 2011-01-14
  • 打赏
  • 举报
回复
vc6是对的啊,&a+1就应该是a的地址+1,vc6显示的是地址值+1有什么错?
T0Ols 2011-01-12
  • 打赏
  • 举报
回复
这不是bug 而是你的写法不是按照标准写法才出现的问题
程序员牛哥 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wyfwx 的回复:]
先自己从语法上找找原因吧,vc6的bug不是那么容易被发现的
[/Quote]

求飞翔的鱼指导
wyfwx 2011-01-11
  • 打赏
  • 举报
回复
先自己从语法上找找原因吧,vc6的bug不是那么容易被发现的
程序员牛哥 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hnuqinhuan 的回复:]
楼主看一下 &a+1对应的值是多少啊 如果加4的话应该是 2 但是VC6.0上面是0
[/Quote]

当&a+n时,实际是按照&a+n*sizeof(a)

&a+1即为&a地址12ff24+1*36 = 12ff48(十六进制)
程序员牛哥 2011-01-11
  • 打赏
  • 举报
回复
&a+1 编译提示error'&' requires l-value

ww884203 2011-01-11
  • 打赏
  • 举报
回复
用VC6的时候还是比较舒服的尤其是只写C语言而不写C++的时候。这么调试我比较少用,也没有看出来过,呵呵
willabc 2011-01-11
  • 打赏
  • 举报
回复
一直用的VC6.0
無_1024 2011-01-11
  • 打赏
  • 举报
回复
楼主看一下 &a+1对应的值是多少啊 如果加4的话应该是 2 但是VC6.0上面是0
無_1024 2011-01-11
  • 打赏
  • 举报
回复

#include<stdio.h>

void main() {

int a[3][3] = {1,2,3,4,5,6,7,8,9};
printf("%x\n",&a);
printf("%x",&a[0][1]);
}
加载更多回复(11)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧