数组溢出
在C语言中数组是静态的,无法实现自动扩容。因此,当下标小于零或大于等于定义的数组长度时,就会发生越界,访问到定义数组以外的内存空间。
数组有两种越界形式:下限越界(Off Normal Lower,下标小于零);上限越界(Off Normal Upper,下标大于等于所定义的数组长度)。
溢出后果
C语言为了提高运行效率,保证操作的灵活性,并不会对数组的越界行为进行检查。因此,即使数组越界了,也能够正常编译,只有在运行期间才可能会暴露问题。
但实际上数组越界所产生的后果可能会十分严重,比如有时会出现“乱码”,即莫名的数据,这是因为当发生数组越界时,我们对该内存有使用权限,但程序未按预期运行;严重时致使程序崩溃,这是因为,我们对该内存没有使用权限,或者该内存一直就没有被分配。
/*该代码能正常编译,但程序发生上限越界(Off Normal Upper,下标大于等于所定义的数组长度)*/
/*因为正确的下标应该是从0开始,到9结束,但程序中产生了一个array[10]的错误,即数组下标越界*/
#include <stdio.h>
#define ARR_SIZ 10
int main()
{
int i;
int array[ARR_SIZ];
for (i = 0; i <= ARR_SIZ; i++)
{
array[i] = 0;
printf("%d\n", i);
}
}
注:GCC、LLVM/Clang、低版本的 VS(例如 VS2010)发现数组溢出只会给出警告,并不会报错。但是高版本的 VS(例如 VS2015、VS2017)发现数组溢出时会报错,禁止编译通过。
如何防范
1)日常的编程中,养成良好的编程习惯,分析、检查数组下标上下限,避免发生数组下标超限,引起数组溢出。
2)数组溢出可能仅发生在某些特殊情况下,增加了发现的难度,可以结合硬件,对程序异常运行给出直观显示。