目录
当我们将数组赋值范围超出它定义的大小时会发生两种情况,
1.无限循环
2.报错跳出
那是什么原因造成了这样的差异,什么下面是我对这个问题的小小总结,有错误的地方希望指正
数组越界:超出数组下标的位置进行访问
无限循环
代码
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("heehe\n");
}
return 0;
}
输出
原因
- 数组中的地址是依次相邻的
- 将数组下标扩大到远超它初始化的大小时,数组会占用相邻的地址
i和arr都是局部变量,局部变量是放在栈区的栈区内存的使用习惯为:
- 先使用高地址处的空间,在使用低地址处的空间
- 而在VS中相同函数内,相邻创建的两个变量的地址相差两个地址
使用监视窗口,并且将for循环完全运行后得到
- 其中地址采用16进制显示,每个int类型的变量占4个地址
从中可以看到,下标为9的数组和下标为12的数组相差12个地址(3个整形的位置),下标为12的数组刚好与i的地址相同,也就是两个变量使用一个地址
我们不难得出这样的内存存储图:
i和arr[12]的地址相同,当变量i发生变化arr[12]也发生变化,arr[12]发生变化变量i也发生变化。
所以当i==12进入循环后,arr[12] = 0使得i变为0,从而进入了死循环,而编译器无法察觉到你的数组越界
报错跳出
代码
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("heehe\n");
}
return 0;
}
输出
原因
变量i在数组之后创建,数组的地址高于i的地址,当数组越界时和变量i无关
当for循环结束后,编译器就会发现你的数组越界了,超出了初始化的范围,不符合c语言的语法,从而发生报错