发现一个奇怪的问题,数组越界竟然不报错!!!

时间:2022-10-25 19:33:57
    环境:VC2008中文版
    问题描述:定义一个数组:
    int nItemXQ[120];

    给程序初始化赋值
    for (k=0;k<120;k++)
   {
nItemXQ[k]=0;
    }
     nItemXQ[120]=0;
    nItemXQ[121]=1;
   //这2处数组下标明显大于120 ,越界了
    可是程序照常运行,没有一点异常,请问是怎么回事呢?

22 个解决方案

#1


并不是一越界就异常的.异常可能会在将来发生,或者这次越界没有破坏关键数据.

#2


正常呀,debug的情况下,不一定报错的,内存检查不严格

#3


数组越界和指针任意指并取值都是未定义的,程序可以编译连接通过
但可能引起各种段错误导致程序崩溃,你这个程序比较简单,越界了也没什么大问题

#4


C++标准上面说了,出错是未定义,就是说以什么形式表现出来都是正常的。

#5


debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心

#6


越界后果自负,编译器不管。

#7


引用 5 楼 lfs09 的回复:
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心


我是在release模式下的啊,也没有报错的

我记得在VC6下这种情况肯定是运行就报错的

#8


数组后面会保留一部分空间的,楼主试下nItemXQ[123]=1;nItemXQ[124]=1;。。。应该会报错的。

#9


  搞不懂怎么不报错

#10


数组越界的检查不是强制性的,是在编译器这边限制的。如果故意恶意越界,编译器是限制不了的。

#11


引用 7 楼 taoshengyijiu20008 的回复:
引用 5 楼 lfs09 的回复:
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心


我是在release模式下的啊,也没有报错的

我记得在VC6下这种情况肯定是运行就报错的
1楼已经说明情况了

#12


那并没有错,越界的那部分只是当常量处理了,若你在对它做其他如加减乘除的操作就会报错了,因为那块内存不是当变量处理的

#13


你用 vc6.0 试试

#14


越界不报你就能越界啦~~

#15


数组访问 和 指针访问是一样的 ,指针有越界之说吗

因为这不是Java和C# 所以数组并不知道自己的大小nItemXQ[121]就是*(nItemXQ+120) 知道了吧

#16


越界不报错,报错想不到越界.....就麻烦了!

#17


你拿了别人的money,别人不来找你,一切OK,但是来找你了,你就麻烦了;
同理

#18


所以用数组一定要小心

#19


越界 如果没覆盖到有用数据 是不会有问题的 不过占掉了一些还没用到 或者没用的空间罢了 所以不会错

但是如果修改到有用的内存的话 就有可能出错了 有可能是报错 也有可能是不错 但是运行出不同的结果

你试下  长度改成10000  然后全部写入 1 我就不信还不错

#20


只有你运行时库去做越界检测才会报错。可是越界检测怎么做?除非是类中的访问越界,你才有机会去检测,在数组越界时,实际上没有任何可靠的方法去检测。既然没有办法准确检测,为什么就一定会报错?报错只有当你数据写到不可写的地方,或者被你破坏的数据导致其他错误才会出现,不会自动报错
引用 7 楼 taoshengyijiu20008 的回复:
引用 5 楼 lfs09 的回复:
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心


我是在release模式下的啊,也没有报错的

我记得在VC6下这种情况肯定是运行就报错的

#21


那是你越界写入东西的位置无关紧要。越界写到谁的地盘是不一定的,写到要害部位一个字节就死翘翘。

#22


应该和操作系统的内存管理有关 

#1


并不是一越界就异常的.异常可能会在将来发生,或者这次越界没有破坏关键数据.

#2


正常呀,debug的情况下,不一定报错的,内存检查不严格

#3


数组越界和指针任意指并取值都是未定义的,程序可以编译连接通过
但可能引起各种段错误导致程序崩溃,你这个程序比较简单,越界了也没什么大问题

#4


C++标准上面说了,出错是未定义,就是说以什么形式表现出来都是正常的。

#5


debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心

#6


越界后果自负,编译器不管。

#7


引用 5 楼 lfs09 的回复:
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心


我是在release模式下的啊,也没有报错的

我记得在VC6下这种情况肯定是运行就报错的

#8


数组后面会保留一部分空间的,楼主试下nItemXQ[123]=1;nItemXQ[124]=1;。。。应该会报错的。

#9


  搞不懂怎么不报错

#10


数组越界的检查不是强制性的,是在编译器这边限制的。如果故意恶意越界,编译器是限制不了的。

#11


引用 7 楼 taoshengyijiu20008 的回复:
引用 5 楼 lfs09 的回复:
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心


我是在release模式下的啊,也没有报错的

我记得在VC6下这种情况肯定是运行就报错的
1楼已经说明情况了

#12


那并没有错,越界的那部分只是当常量处理了,若你在对它做其他如加减乘除的操作就会报错了,因为那块内存不是当变量处理的

#13


你用 vc6.0 试试

#14


越界不报你就能越界啦~~

#15


数组访问 和 指针访问是一样的 ,指针有越界之说吗

因为这不是Java和C# 所以数组并不知道自己的大小nItemXQ[121]就是*(nItemXQ+120) 知道了吧

#16


越界不报错,报错想不到越界.....就麻烦了!

#17


你拿了别人的money,别人不来找你,一切OK,但是来找你了,你就麻烦了;
同理

#18


所以用数组一定要小心

#19


越界 如果没覆盖到有用数据 是不会有问题的 不过占掉了一些还没用到 或者没用的空间罢了 所以不会错

但是如果修改到有用的内存的话 就有可能出错了 有可能是报错 也有可能是不错 但是运行出不同的结果

你试下  长度改成10000  然后全部写入 1 我就不信还不错

#20


只有你运行时库去做越界检测才会报错。可是越界检测怎么做?除非是类中的访问越界,你才有机会去检测,在数组越界时,实际上没有任何可靠的方法去检测。既然没有办法准确检测,为什么就一定会报错?报错只有当你数据写到不可写的地方,或者被你破坏的数据导致其他错误才会出现,不会自动报错
引用 7 楼 taoshengyijiu20008 的回复:
引用 5 楼 lfs09 的回复:
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心


我是在release模式下的啊,也没有报错的

我记得在VC6下这种情况肯定是运行就报错的

#21


那是你越界写入东西的位置无关紧要。越界写到谁的地盘是不一定的,写到要害部位一个字节就死翘翘。

#22


应该和操作系统的内存管理有关