一.数组越界的概念

1.数组的下标是由范围限制的

2.数组的下标规定是从0开始的,如果一个数组里面有n个元素,那么最后一个元素的下标就是n-1

3.当数组的下标小于0或者大于n-1,那就是数组越界访问了,超出了数组合法空间的访问

4.C语言本身是不会做数组下标的越界检测的,编译器在编译代码时候也不一定报错,但是编译器不报错不代表程序就能正确的运行,所以我们在写代码的时候应自己做好越界检查

如下代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int arr[8] = {1,2,3,4,5,6,7,8};
	int i = 0;
	for (i = 0; i < 10; i++){
		printf("arr[%d]--->%d\n",i,arr[i]);
	}
	getchar();
	return 0;
}

以上代码创建了数组 arr 里面存放了8个整数,但是for循环却需要打印数组中10个元素,超出了限制,所以导致最后两个元素的值是内存随机值,如图所示:

C语言数组(6)--- 数组越界_数组

同时编译器也没有提示任何的错误(新版VS2023可能会警告)所以我们需要自己在写代码时做好数组的越界检查,常见的防止数组越界的方法有使用sizeof()函数计算出数组中的元素数量,如下代码:

int sz = sizeof(arr)/sizeof(arr[0]);

我们可以将上述代码修改成如下形式:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int arr[8] = {1,2,3,4,5,6,7,8};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++){
		printf("arr[%d]--->%d\n",i,arr[i]);
	}
	getchar();
	return 0;
}

我们先将数组arr中的元素个数计算出来,然后将计算的结果赋值给sz这个变量,在写for循环条件的时候只要变量 i 小于 sz 就进入循环,如图所示:

C语言数组(6)--- 数组越界_二维数组_02

二维数组的越界也需要我们注意,如以下代码就会导致数组访问越界:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int i = 0;
	for (i = 0; i < 3; i++){
		int j = 0;
		for (j = 0; j <= 4; j++){
			printf("arr[%d][%d]-->%d\n",i,j,arr[i][j]);
		}
	}
	getchar();
	return 0;
}

二维数组分为行与列,当我们在输出列的时候,for循环中的语句应为 j<4 而不是 j<=4 ,当我们编译并运行上述代码的时候就会发现数组访问越界了,如图所示:

C语言数组(6)--- 数组越界_数组越界_03

由于我们现在还未学到计算二维数组的行与列,所以我们应该格外小心数组访问越界的问题

                                                                                                   2023/8/25

                                                                                                      王起舟