小问题,大智慧!

wzywatermelon 2011-08-09 02:17:37
void main()
{
int a[240];
int b[240];
int i;
for(i=0;i<200;i++)
{
for(i=0;i<2100;i++)
{
a[i]=1; //这里为什么不越界?
}
}
return ;
}

请问这段代码最后a[i]会发生什么情况,为什么运行后debug i的值为240的时候还不越界?
标题有点坑人哈~
...全文
2996 78 打赏 收藏 转发到动态 举报
写回复
用AI写文章
78 条回复
切换为时间正序
请发表友善的回复…
发表回复
烈火蜓蜻 2011-09-20
  • 打赏
  • 举报
回复
void main()
{
int a[240];
int b[240];
int i;
for(i=0;i<200;i++)
{
for(i=0;i<2100;i++)
{
a[i]=1; //这里为什么不越界? 因为你的运气比较好,a和b分配到了连续的空间,所以到240时没有崩溃,到500没崩,只能说,你的运气还是不错,用到没被别的程序占用的空间,系统没Kill掉你。
}
}
return ;
}
CJacky++ 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 yachong 的回复:]
越界!=崩溃,这个看人品
[/Quote]
+1.
越界不一定会崩溃的。所以才可怕,因为你不知道软件什么时候会异常!!!!
CCSOY 2011-08-18
  • 打赏
  • 举报
回复
大智慧 or 好人品
staticabc 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 everax 的回复:]
引用 3 楼 pamtry 的回复:

只要超出你数组下标就已经越界了,只是没有报错和崩溃罢了

至于为什么没有崩溃,需要参考C运行时堆、栈结构

就是这样

我试了几遍,又把 a[i] = 1 改成 a[i] = i,又改回去了
结果是,前几遍正常运行,改过之后,错误,改回去,错误
[/Quote]
+1
DiamondCG 2011-08-18
  • 打赏
  • 举报
回复
看一看!

每天回帖即可获得10分可用分!
worldy 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 wzywatermelon 的回复:]
void main()
{
int a[240];
int b[240];
int i;
for(i=0;i<200;i++)
{
for(i=0;i<2100;i++)
{
a[i]=1; //这里为什么不越界?
}
}
return ;
}

请问这段代码最后a[i]会发生什么情况,为什么运行后debug i的值为240的时候还不越界?
标题有点坑人哈~
[/Quote]

c边界检查不负责边界检查,边界检查是你的责任!
越界后,轻则造成数据不正确,重则会引起一般保护错误
bravery36 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 68 楼 sljw1986 的回复:]
其实是越界了,只不过越界的内存是不定的, 有时候是b【240】 被占用了,有时候是其他的内存空间被占用,反正这样写 很容易导致系统重启,崩溃等。
[/Quote]
这是不可能的,win2000之后内核的内存和应用层的内存已经分开管理了,越界也越不到那里。
lisongmei12 2011-08-16
  • 打赏
  • 举报
回复
顶一下
xunfeng_2008 2011-08-16
  • 打赏
  • 举报
回复
你知道越界就可以了,
为什么没有程序没有崩溃是另外一个问题,继续学习吧。
Dirk 2011-08-16
  • 打赏
  • 举报
回复
肯定是越界了。只是数组访问方式和指针方式的安全策越不一样。没有报错罢了,没有崩溃也是巧合而已。
菜鸟1v1 2011-08-16
  • 打赏
  • 举报
回复
其实是越界了,只不过越界的内存是不定的, 有时候是b【240】 被占用了,有时候是其他的内存空间被占用,反正这样写 很容易导致系统重启,崩溃等。
book2016 2011-08-16
  • 打赏
  • 举报
回复
越界不一定崩溃,内存崩溃一定越界
blacktea000 2011-08-15
  • 打赏
  • 举报
回复
越界是明显的,还用得着讨论么。别浪费时间了
jernymy 2011-08-14
  • 打赏
  • 举报
回复
楼主运气好,实际上已经越界了。
TOOCROWN 2011-08-13
  • 打赏
  • 举报
回复
这样用的应该很少吧!
sanyuegongzi 2011-08-13
  • 打赏
  • 举报
回复
另外,你的第一个循环是无效的,只会运行一次
执行第二层循环修改 i的值大于了200 也就是,第一层循环就执行了初始的那一次。
sanyuegongzi 2011-08-13
  • 打赏
  • 举报
回复
你用的vc vc为了追求极致效率而越界不检查,你如果加一行代码
输出b[0]到b[239]值会看到他们的值全是1.
甚至 b240 之后的没4个字节也被赋值成了1;
你得自己尝试,c局部语言变量在栈里面的存储方式,越过了a空间是b空间,也就是a越界以后继续给b空间赋值了。


我唯一不能理解的是,为什么我的电脑上只能输出1296个1 也没有提示,栈耗尽。
rendao0563 2011-08-12
  • 打赏
  • 举报
回复
就一个回答靠谱. 解释本质问题. 楼层是9的整数倍. 应该可以猜到的.
wlcbh 2011-08-12
  • 打赏
  • 举报
回复
这个需要调试跟踪定位
shi3590 2011-08-12
  • 打赏
  • 举报
回复
我只想说压栈与内存增长顺序相反,你对a进行赋值操作确实越界了,但是越界操作如果不带来内存上的错误是不会有提示的。如果想弄明白这些,建议把赋值换成b[i]=1,然后单步看看a数组元素的变化,最后再去看看函数调用规约。
加载更多回复(54)

69,369

社区成员

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

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