问题描述:定义一个数组:
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都不报错,所以写代码时,一定要小心
有时release都不报错,所以写代码时,一定要小心
#6
越界后果自负,编译器不管。
#7
我是在release模式下的啊,也没有报错的
我记得在VC6下这种情况肯定是运行就报错的
#8
数组后面会保留一部分空间的,楼主试下nItemXQ[123]=1;nItemXQ[124]=1;。。。应该会报错的。
#9
搞不懂怎么不报错
#10
数组越界的检查不是强制性的,是在编译器这边限制的。如果故意恶意越界,编译器是限制不了的。
#11
1楼已经说明情况了
#12
那并没有错,越界的那部分只是当常量处理了,若你在对它做其他如加减乘除的操作就会报错了,因为那块内存不是当变量处理的
#13
你用 vc6.0 试试
#14
越界不报你就能越界啦~~
#15
数组访问 和 指针访问是一样的 ,指针有越界之说吗
因为这不是Java和C# 所以数组并不知道自己的大小nItemXQ[121]就是*(nItemXQ+120) 知道了吧
因为这不是Java和C# 所以数组并不知道自己的大小nItemXQ[121]就是*(nItemXQ+120) 知道了吧
#16
越界不报错,报错想不到越界.....就麻烦了!
#17
你拿了别人的money,别人不来找你,一切OK,但是来找你了,你就麻烦了;
同理
同理
#18
所以用数组一定要小心
#19
越界 如果没覆盖到有用数据 是不会有问题的 不过占掉了一些还没用到 或者没用的空间罢了 所以不会错
但是如果修改到有用的内存的话 就有可能出错了 有可能是报错 也有可能是不错 但是运行出不同的结果
你试下 长度改成10000 然后全部写入 1 我就不信还不错
但是如果修改到有用的内存的话 就有可能出错了 有可能是报错 也有可能是不错 但是运行出不同的结果
你试下 长度改成10000 然后全部写入 1 我就不信还不错
#20
只有你运行时库去做越界检测才会报错。可是越界检测怎么做?除非是类中的访问越界,你才有机会去检测,在数组越界时,实际上没有任何可靠的方法去检测。既然没有办法准确检测,为什么就一定会报错?报错只有当你数据写到不可写的地方,或者被你破坏的数据导致其他错误才会出现,不会自动报错
#21
那是你越界写入东西的位置无关紧要。越界写到谁的地盘是不一定的,写到要害部位一个字节就死翘翘。
#22
应该和操作系统的内存管理有关
#1
并不是一越界就异常的.异常可能会在将来发生,或者这次越界没有破坏关键数据.
#2
正常呀,debug的情况下,不一定报错的,内存检查不严格
#3
数组越界和指针任意指并取值都是未定义的,程序可以编译连接通过
但可能引起各种段错误导致程序崩溃,你这个程序比较简单,越界了也没什么大问题
但可能引起各种段错误导致程序崩溃,你这个程序比较简单,越界了也没什么大问题
#4
C++标准上面说了,出错是未定义,就是说以什么形式表现出来都是正常的。
#5
debug模式下经常这样,我用的还是vs2008呢,都这样,release时,就狂报错,还搞了好久才发现的呢....
有时release都不报错,所以写代码时,一定要小心
有时release都不报错,所以写代码时,一定要小心
#6
越界后果自负,编译器不管。
#7
我是在release模式下的啊,也没有报错的
我记得在VC6下这种情况肯定是运行就报错的
#8
数组后面会保留一部分空间的,楼主试下nItemXQ[123]=1;nItemXQ[124]=1;。。。应该会报错的。
#9
搞不懂怎么不报错
#10
数组越界的检查不是强制性的,是在编译器这边限制的。如果故意恶意越界,编译器是限制不了的。
#11
1楼已经说明情况了
#12
那并没有错,越界的那部分只是当常量处理了,若你在对它做其他如加减乘除的操作就会报错了,因为那块内存不是当变量处理的
#13
你用 vc6.0 试试
#14
越界不报你就能越界啦~~
#15
数组访问 和 指针访问是一样的 ,指针有越界之说吗
因为这不是Java和C# 所以数组并不知道自己的大小nItemXQ[121]就是*(nItemXQ+120) 知道了吧
因为这不是Java和C# 所以数组并不知道自己的大小nItemXQ[121]就是*(nItemXQ+120) 知道了吧
#16
越界不报错,报错想不到越界.....就麻烦了!
#17
你拿了别人的money,别人不来找你,一切OK,但是来找你了,你就麻烦了;
同理
同理
#18
所以用数组一定要小心
#19
越界 如果没覆盖到有用数据 是不会有问题的 不过占掉了一些还没用到 或者没用的空间罢了 所以不会错
但是如果修改到有用的内存的话 就有可能出错了 有可能是报错 也有可能是不错 但是运行出不同的结果
你试下 长度改成10000 然后全部写入 1 我就不信还不错
但是如果修改到有用的内存的话 就有可能出错了 有可能是报错 也有可能是不错 但是运行出不同的结果
你试下 长度改成10000 然后全部写入 1 我就不信还不错
#20
只有你运行时库去做越界检测才会报错。可是越界检测怎么做?除非是类中的访问越界,你才有机会去检测,在数组越界时,实际上没有任何可靠的方法去检测。既然没有办法准确检测,为什么就一定会报错?报错只有当你数据写到不可写的地方,或者被你破坏的数据导致其他错误才会出现,不会自动报错
#21
那是你越界写入东西的位置无关紧要。越界写到谁的地盘是不一定的,写到要害部位一个字节就死翘翘。
#22
应该和操作系统的内存管理有关