为什么简单的C ++向量函数会产生超出边界的下标?

时间:2017-03-24 06:16:37

标签: c++ vector

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

#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(),它应该是整个向量。

2 个答案:

答案 0 :(得分:2)

vector<int> a;创建一个空向量,因为它是空的(即没有元素),访问带有a[index]的元素总是超出边界访问,这会导致未定义的行为,并且在你的情况下,崩溃。使用push_backemplace_back将元素附加到矢量。

答案 1 :(得分:1)

这将解决您的问题:

#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");
}