C语言常见错误之一_数组下标越界
作者:互联网
数组特性
数组相较于其他数据结构而言,“随机访问”是它最大的一个特点,即数组能够通过下标索引来快速访问相应位置上的元素。
下标越界
正是因为数组具有以上的特性,而在C语言中,数组是静态的,每次定义一个数组的时候程序设计者必须确定数组大小,而且C语言在编译的时候不会检查下标越界的问题,所以如果程序中出现了下标越界的问题,一般后果都是相当严重的。
作为程序员,检查数组的边界问题是我们的职责所在。
有如下代码:
#include "stdio.h"
int main(){
int arr[3]={0};
for(int i =0;i<=3;i++){
arr[i]=0;
printf("wo");
}
return 0 ;
}
代码执行结果并非输出3个“wo”,而是一个死循环。
为什么会出现这样的越界问题呢?
其实这和数组的访问原理有关。我们知道,计算机会给每个存储单元分配一个地址,目的是为了计算机能通过地址来访问内存中的数据。当计算机想要方位下标为i的数组元素的时候,它首先会通过下面的这个寻址公式计算出该元素的内存地址,然后根据地址访问对应的内存单元。
寻址公式:a[i]_address = base_address + i*data_type_size >
在上述代码中,arr[3]会被定位到某块不属于数组arr的内存地址中,而这个地址正好是储存变量i的内存地址,那么arr[3]=0,就相当于i= 0,因此会导致无限循环。
思考一个问题:为什么绝大多数编程语言下标索引值会是从0开始,而不是1呢?
下一期讨论这个问题!
电子书分享:
《人工智能简史》
链接:https://www.aliyundrive.com/s/1mDuU7poX1P
标签:arr,下标,int,C语言,越界,数组,内存地址 来源: https://www.cnblogs.com/mmzwx/p/15860275.html