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

相关