社区
C语言
帖子详情
小问题,大智慧!
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
打赏
收藏
小问题,大智慧!
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的时候还不越界? 标题有点坑人哈~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
智慧
税务专题-如何设计税务管理解决方案?
本课程将从
智慧
税务建设的现状和需求分析以及面临的主要
问题
为出发点,分享
智慧
税务主要建设内容、建设理念准则、建设目标;阐述
智慧
税务平台总体架构以及核心功能实现路径。同时,分享在实际项目中,
智慧
税务核心...
macd的VB计算机程序,大
智慧
自选股实时同步到通达信VB小软件简单升级
好股票软件下载网(www.goodgupiao.com)提示:您正在下载的是:大
智慧
自选股实时同步到通达信VB小软件简单升级没有进行大的改动,只是增加了一个蜂鸣提醒功能,就是每一次同步后,电脑蜂鸣一声提醒已经有新股票过来了...
python 大
智慧
接口_大
智慧
L2实时api接口
"ifIcon":"img"}],"card":[],"search":[],"infoCard":[],"title":{"mainTitle":"mPaaS","subtitle":"源自于支付宝小程序框架,亿级线上业务体量的锤炼,安全性媲美支付宝原生能力。不仅面向自有 App 投放小程序,更...
小故事大
智慧
只见他手里抱着一个小孩子,美丽女子手里牵着一个小孩子,肚 子里还怀着第三个。 最后出来的是犹太人,他紧紧握住监狱长的手说: “ 这三年来我每天与外界联系,我的 生意不但没有停顿,反而增长了 200 ...
大
智慧
公式编写教程
大
智慧
公式编写教程 公式入门我们大多数的用户并不是完全了解“公式编辑器”的意义,简单地,我们可以从以下几个角度进行理解:一、指标分析:“公式编辑器”好比是一个工作母床,通过这个工作母床可以制造出所需要...
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章