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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值