C语言之数组越界

C语言难点:数组越界

今天巨星给大家讲一讲数组越界…

  1. 数组的定义
    数组组成:函数类型,数组名,[数组长度];PS:数组长度必须是常量,c99允许变量使用,vs编译器不允许,例:int b =10;int arr[b]//c99允许,vs不可以;例如:int arr[10]表示的是函数类型为int,长度为10的数组arr;注意:数组在使用时没有函数类型,而且[数组下标],例如:arr[0]=1表示数组arr下标为0的数组元素为1,这个0就是下标;只有定义的时候是有数据类型和[数组长度];
  2. 数组初始化
    a.int arr[10]={1,2,3,4,5,6,7,8,9,10};用花括号将数组元素全部初始化;
    b.int arr[10]={1,2,3,4,5};数组元素初始化一部分,注意剩余的部分(也就是没有初始化的部分)为0;即输出数组arr[10]的值为1,2,3,4,5,0,0,0,0,0;
    c.int arr[ ]={1,2,3,4,5,6,7,8};没有定义数组长度,数组长度自动定义为8即刚好容纳初始化的所有元素;这种初始化数组的方法比较好用;
  3. 数组越界难点
    先简单看一个例子,int arr[10];arr[10]=1;//数组越界;数组的长度为10,数组下标从0开始,所以长度为10的数组下标最大到9,因此数组下标为10就是数组越界;粗看很简单,但很容易出错;
    再来看一下下面的代码:
#include <stdio.h>
int main()
{
int i;
int arr[10];
for(i=0;i<=10;i++)
{
arr[i]=0;
printf("%d\n",i);
}
return 0;
}

分析:首先定义i,根据数据结构栈可知i放在栈底(地址高),数组后定义放在栈顶(地址低)数组arr[10]的数组元素从栈顶依次从0到9往下,i放在栈底;然后进入for循环,i从0开始,然后数组arr[0]赋值为0,依次类推,直到i=9,arr[9]=0,i++变成10,arr[10]=0,数组找不到10号元素就把i当做10号元素,i就赋值为0;程序陷入死循环;看关系:
i=0; arr[0]=0;printf i=0;
i=1; arr[1]=0;printf i=1;
i=2; arr[2]=0;printf i=2;
i=3; arr[3]=0;printf i=3;
i=4; arr[4]=0;printf i=4;
i=5; arr[5]=0;printf i=5;
i=6; arr[6]=0;printf i=6;
i=7; arr[7]=0;printf i=7;
i=8; arr[8]=0;printf i=8;
i=9; arr[9]=0;printf i=9;
i=10; arr[10]=0;printf i=0;//i又从0开始进入循环,因此程序陷入死循环,这就是数组越界;注意:C语言数组越界时,vs编译器会自动埋下两颗地雷,当数组越界时,系统就会崩溃,无法编译;但可以人为改动,在for循环中加入if语句 (if(i == 10){i+=2;}) 此时编译运行就会陷入死循环;

编译结果图:
图一:数组越界时vs编译系统崩溃;

图二:加入if语句跳过地雷,编译死循环;


以上就是数组越界的大概内容,希望对大家有所帮助…

巨星出品


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值