数组下标越界:
在引用数组元素时,使用的下标超过了该数组下标的应有范围。

内存溢出:
在初始化数组(给数组元素赋值)时,初始化(赋值)元素的个数超过了数组定义时元素的个数。对于多维数组,元素个数=每个方框框里的数字之积。
求数组元素个数也可以用公式:数组元素个数=sizeof(数组名)/sizeof(数组任意一个元素)

  1. 下标越界
#include <stdio.h>
int main()
{
int i = 10, arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);
int index = 0;
scanf_s("%d", &index);
arr[index] = 20;
printf("arr[%d] = %d\n", index, arr[index]);
system("pause");
return 0;
}

数组定义为arr[10],它的下标范围为0-9,超过这个范围就会发生下标越界。

溢出和越界的区别_下标越界


溢出和越界的区别_数组_02


以上两张图是在Visual Studio2019中的运行结果,两次输入的下标都会越界,但是第一张图报错了,而第二张却没有报错,这是因为VS2019编译器在处理数组下标时,只认为当引用的下标等于数组元素个数时,下标越界,别的情况不会去检测和处理(当我输入的下标为11,程序也不会报错)。

2. 内存溢出

#include <stdio.h>

int main()
{
int count[100], i;
for (i = 0; i <= 100; i++)
{
count[i] = 1;
}
system("pause");
return 0;
}

溢出和越界的区别_下标越界_03


数组定义为count[100],则数组共有100个元素。这里初始化时,for循环一共循环了101次,所以是要给数组初始化101个元素的值,而数组只有100个元素,这样就导致了内存溢出。

但在linux(CentOS6.5)环境下,编译链接运行都可以,但程序停不下来,关闭终端时,程序仍在进行。