C++避坑指南-数组越界

问题场景

在访问数组时没有判断数组size, 导致访问的索引号超过了数组size产生访问越界,程序出现异常行为

示例代码

实际情况比较多, 我们来展开说明下

原生数组访问越界

#include 
using namespace std;

void ArrayOut()
{
    int a[] = {23,33,1,32,5,9,10};
    for(int i = 0; i <= 10; i++)
    {
        cout << a[i] << endl;
    }
}

int main(int argc, char* argv[])
{
    ArrayOut();
    return 0;
}

运行结果

C++避坑指南-数组越界_第1张图片

注意程序并没有coredump, 而是读到了脏数据,如果是实际应用,这些脏数据将产生不可预测的行为,很可能转嫁为其他的异常或coredump,这种情况将更难排查

vector索引访问越界

void VectorOutOfIndex()
{
    vector a({23,33,1,32,5,9,10});
    for(int i = 0; i <= 10; i++)
    {
        cout << a[i] << endl;
    }
}

结果和原生数组一致,访问到了脏数据但并没有coredump

C++避坑指南-数组越界_第2张图片

 vector首末元素访问越界

void EmptyVectorOut()
{
    vector emptyVector;
    cout << emptyVector.front() << endl;
}

int main(int argc, char* argv[])
{
    EmptyVectorOut();
    return 0;
}

运行结果为程序coredump

 原因:

front()函数内部会检查容器是否为空, 如果为空会抛出异常导致core dump

解决方法

1.原生数组的访问, 需要在初始化时记住size,并在遍历等访问时判断避免越界

2.容器类遍历时可以使用迭代器或如下写法

void VectorLoop()
{
    vector a({23,33,1,32,5,9,10});
    for(int element : a)
    {
        cout << element << endl;
    }
}

3.访问容器类首末元素 front(), back(), 一定要加上empty()判断

你可能感兴趣的:(C++避坑指南,c++)