C语言数组下标越界致使数组溢出

数组溢出

在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)数组溢出可能仅发生在某些特殊情况下,增加了发现的难度,可以结合硬件,对程序异常运行给出直观显示。


猜你喜欢

转载自blog.csdn.net/m0_64770246/article/details/128684266