c/c++数组越界规则之——越界数据
代码如下:
#include<stdio.h>
void main()
{
int aa[3]={ 0, 1 };
int i;
for( i=0; i < 5 ; i++ )
{
printf( " %d\n", aa[i] );
}
printf( " 地址:\n" );
for( i=0; i < 5 ; i++ )
{
printf( " %d\n", aa[i] );
}
}
运行结果如下:
可以看到 aa[3], aa[4] 的值为随机值,aa[0]~aa[4] 都是一片连续有序的存储空间。
c/c++数组越界规则之——循环问题
有正确代码如下
#include<stdio.h>
void main()
{
int i;
int arr[3];
for( i=0; i < 3; i++ )
{
arr[i]=0;
printf( " %d\n", i );
}
}
执行结果为:
在 c99 中
当循环条件为 i<=3 时, arr[3] 数组出现越界,会出现 012012012012… 的无限死循环。
其原因是:
变量,数组元素在编译器中以栈的形式存放,按先后顺序依次存入栈中先存入的在栈底,地址大,后存入的靠近栈顶,地址小。
执行
int i;
int arr[3];
存储状态如下:
当 i=3,arr[3] 越界,arr[3] 指向 i ,由 arr[2] 增加四个字节变成了变量 i 的地址,执行语句{ arr[3]=0;} ,0也赋给了 i 即 i=0,所以再次进入循环,形成012012012012012…的死循环。
在Windows visual x86中
变量与变量之间安放了两颗炸弹,若越界则会触碰炸弹使程序崩溃
但若跳过两颗炸弹则又会产生于c99同原理的情况,进入死循环
int i;
int arr[3];
for( i = 0; i < = 3; i++ )
{
if(i=3){ i = 5; }
arr[i] = 0;
printf( " %d\n ", i );
}