比如数组定义时有十个元素,那么a[0] -- a[9] 分别对应相应的元素,在程序中如果使用了a[10]那么就超出了原来的数组定义的范围,这就是数组下标越界。颤世郑
c和c++语言中数组下标越界,编译器是不会检查出错误的,但是实际上后果可能会很返氏严重,比如程序崩溃等,所以在日常的编程中,程序员应当养成良好的编程习惯,避免这样的错误发生。
扩展资料
VB中的数组越界
12、引用了不存在的数组元素
下标可能比下标范围大或小,或是在应用程序中这一边的数组没茄颂有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。
声明数组时没有指定元素的数目。例如,下列的代码就会导致此错误:Dim MyArray() As Integer
MyArray(8) = 234 ' 导致错误 9。Visual Basic 并不会将没有指定范围的数组自动设为 0 – 10。相反必须使用 Dim 或 ReDim 来指定数组中元素的数目。
2、引用了不存在的集合成员。
试着使用 For Each...Next 结构代替指定元素下标。使用速写形式的下标,结果指定了错误的元素。
1、什么是数组访问越界?我们通过数组的下标来得到数组内指定索引的元素。这称作对数组的访问。
如果一个数组定义为有n个元素,那么,对这n个元素(下标为0 到
n-1的元素)的访问都合法,如果对这n个扰雀元素之外的访问,就是非法的,称为“越界。
数组占用了一段连续的内存空间。然后埋梁,我们可以通过指定数组下标来访问这块内存里的不同位置。因此,当你的下标过大时,访问到的内存,就不再是这个数组“份内”的内存。你访问的,将是其它变量的内存了。
2、访问越界会出现什么结果?
首先,它并不会造成编译错误!就是说,C,C++的编译器并不判断和指出你的代码“访问越界”了。一个明明是错误的东西,就这样“顺利”地通过了编译。数组访问越界在运行时,它的表现是不定的,有时似乎什么事也没有,程序一直运行(当然,某些错误结果已造成);有时,则是程序一下子崩溃。因此在使用数组时,一定要在编程中判断是否越界以保证程序的正确性。
常见的错误就是数组的size值和下标访问值弄错,数组的下表是从0开始的,最大的访问值是size-1。
3、解决办法
由于数组的元素个数默认情况下是不作为实参内容传入调用函数的缓液早,因此会带来数组访问越界的相关问题,解决问题方法,可以用传递数组元素个数的方法即:用两个实参,一个是数组名,一个是数组的长度。
举例:
#include
void PutArray(int *p, int length)
{
// 在此判断入口参数p和length的有效性
……
for(int
i=0i<lengthi++)
printf("%d\t",p[i])
}
void main()
{
int a[3]={2,4,6}
printf("数组a[3]调用函数PutArray的结果为:\n")
PutArray(a,
sizeof(a)/sizeof(a[0]))
}
记得循环的时候,下标是从0开春核始到N-1,打印出遍历数组的索引十扒颤掘分有帮助,注意一下它的循环条件,也可以加断点。
出现此类问题的原因有多方面。总结一下我所理解的,数组的长度决定了它所能装载的数据的量。还有就是数组计数洞悉是从零开始的。例如:当Srring arr[]==new String[6]如果要往里输入名字的话就只能输入六个,多了就是下标越界。
另外数组一般都是与for循环结合起来用,所以用的的时候要注意一下它的循环条件。数组下标越界异常:Java.lang.ArrayIndexOutOfBoundsException,这是一个非常常见的异常,从名字上看是数组下标越界错误,解决方法就是查看为什么下标越界。这种错误就是字符串索引越界。
当处理数组越界时,打印出遍历数组的索引十分有帮助,这样我们就能够跟踪代码找到为什么索引达到了一个非法的值。
所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)