为什么简单的C++向量函数会产生越界的下标

Why does simple C++ vector function produce subscript out of bounds?

本文关键字:越界 下标 函数 简单 C++ 向量 为什么      更新时间:2023-10-16

这是一个简单的函数,它接受整数向量,并且只对奇数条目求和。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int f(vector<int> & n)
{
    vector<int>::iterator itA;
    int sum = 0;
    for (itA = n.begin(); itA != n.end(); itA++)
    {
        if (*itA % 2 == 1) sum += *itA;
    }

    return sum;
}
int main()
{
    vector<int> a;
    a[0] = 3;
    a[1] = 5;
    a[2] = 6;
    a[3] = 1;
    cout << f(a) << endl;
    system("pause");
}

运行时,由于矢量下标超出范围,它会崩溃。为什么会这样呢?迭代器从 vector.begin(( 开始,穿过向量,而迭代器不指向 vector.end((,这应该是整个向量。

vector<int> a;创建一个空向量,并且由于它是空的(即没有元素(,因此使用 a[index] 访问元素始终是越界访问,这会导致未定义的行为,并且在您的情况下会导致崩溃。使用 push_backemplace_back 将元素追加到矢量。

这将解决您的问题:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int f(vector<int> & n)
{
    vector<int>::iterator itA;
    int sum = 0;
    for (itA = n.begin(); itA != n.end(); itA++)
    {
        if (*itA % 2 == 1) sum += *itA;
    }

    return sum;
}
int main()
{
    vector<int> a(4);
    a[0] = 3;
    a[1] = 5;
    a[2] = 6;
    a[3] = 1;
    cout << f(a) << endl;
    system("pause");
}