很相似的两个概念,一不小心就会混淆
首先,对两个名词做一个大概的解释:
用两个具体的例子来看看它们之间的区别:
1、 下标越界
#include <stdio.h>
int main()
{
int i=10, arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);
int index = 0;
scanf("%d", &index);
arr[index] = 20;
printf("arr[%d] = %d\n", index,arr[index]);
system("pause");
return 0;
}
数组定义为arr[10],它的下标范围是 0–9 ,超出这个范围就会发生下标溢出
以上两张图片是在VS2013里面的运行结果,两次输入的下标都会越界,但为什么第一张图报错了(数组下标越界),而第二张没有。 这是因为VS2013这个编译器在处理数组下标时,只认为当引用的下标等于数组元素个数时下标越界(可能是怕初学者把数组下标当成是以0开始的吧),别的情况别不回去检测和处理(当我输入的值大于等于11,程序都不会报错)。
以上是在VC6.0的运行结果,VS2013不同,VC6.0里报错出现在输入值为11时(当输入12时也会报错),而输入10时并不会报错。 这是因为VC6.0里认为当引用数组元素时,若数组的下标比数组的元素个数大 1 (或大 2)时下标越界,。而对于其余的情况不予检测。
而在Linux(CentOS6.5)里面运行时,就是我们开头说的那种下标越界的情况,不管你下标咋越界,我的编译器都不会对数组下标做边界检查。
2、 内存溢出
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int count[100], i;
for (i = 0; i <= 100; i++)
{
count[i] = 1;
}
system("pause");
return 0;
}
数组定义为count[100],则数组共有100个元素。这里初始化时,for循环一共循环了101次,所以是要给数组初始化101个元素的值,而数组只有100个元素,这样就导致了内存溢出。
VS2013环境下,编译链接运行都可以,但会抛出一个错误—>>数组内存溢出。
这是在VC6.0环境下,编译链接运行都可以,但同样会出错。
这是在Linux(CentOS6.5)环境下,编译链接运行都可以,但程序停不下来,关闭终端时可以看到程序仍在进行。
因此,虽然数组在C语言中是个很强大的东西,但在应用时一定要注意,千万不要出现下标越界的情况,因为这样会造成不可想象的错误。比如下标越界那个例子中的 i 我定义为10,当在VS2013环境下,我输入的下标值为12,在输出arr[12] = 20 的同时,会把i的值也改为20(VS中定义的两个变量,分配内存时会在两个变量的内存空间之间隔出两个空间,空间大小为整形大小),这样别处再用到 i 时 会得到一个错误的 i 的值,可能机会导致一连串的错误,致使结果与预期相差甚远。同时,在初始化数组时,要注意不要初始化的元素个数,不要超出了定义时的个数。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180397.html原文链接:https://javaforall.cn