一个小BUG的迷惑

netying 2016-04-02 09:53:27
#define N_COUNT 60

bool m[N_COUNT];
for(int i=0;i<=N_COUNT;i++)m[i]=true;
//-------------------------------------------------------
上边这段代码,其中i<=N_COUNT,这里应该是用<,而不是<=.
这样写造成地址越界了.

但是我发现,如果定义的N_COUNT小于60的话,是可以运行通过的,功能不受影响.

这是什么原因呢?
...全文
201 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigfog 2016-04-07
  • 打赏
  • 举报
回复
这个就像闯红灯一样,不是每次都出问题,只是风险比较大
hongss 2016-04-06
  • 打赏
  • 举报
回复
未知的东西最可怕。。。
fxworld 2016-04-03
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
这个跟操作系统的内存管理有关,提交的内存是以页(4K、2M或者4M大小)的倍数分配的,所以一个变量后面有一定数量的可写内存的概率是很大的,编译器又不做范围检查的话,就可以越界写不出现AV,但是逻辑上可能会有问题,因为覆盖了后面的数据。
正解
  • 打赏
  • 举报
回复
这个跟操作系统的内存管理有关,提交的内存是以页(4K、2M或者4M大小)的倍数分配的,所以一个变量后面有一定数量的可写内存的概率是很大的,编译器又不做范围检查的话,就可以越界写不出现AV,但是逻辑上可能会有问题,因为覆盖了后面的数据。
勉励前行 2016-04-03
  • 打赏
  • 举报
回复
越界不一定会出错,但没保障。不越界就是肯定不出错。 bool *m = new bool; for(int i=0;i<=60;i++)m[i]=true; 这样也有很大几率不出错。
godanddog 2016-04-03
  • 打赏
  • 举报
回复
已经越界了,只是没出错,也不一定会报错,但很危险,谁知道越界的那个内存地址存的是什么东西
anshichaoya 2016-04-02
  • 打赏
  • 举报
回复
当I=60的时候,m[60]=ture就越界了。i最大应该是59
netying 2016-04-02
  • 打赏
  • 举报
回复
对了,补充说明一下:我使用的是BCB6,Win7中文企业版. 我测试的是,超过60就报错,60以下正常运行.
ooolinux 2016-04-02
  • 打赏
  • 举报
回复
已经越界了,后果不堪设想
路过路人乙 2016-04-02
  • 打赏
  • 举报
回复

以上是我测试结果...
我也没弄清楚为何不会越界...按道理来说..m[60]就是m[0]到m[59]

不过没你所说的小于60就可以..等于60就不行..我的测试结果好像是..什么数字都可以....同不理解..等解答吧

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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