为啥简单的 C++ 向量函数会产生越界的下标? [复制]

Posted

技术标签:

【中文标题】为啥简单的 C++ 向量函数会产生越界的下标? [复制]【英文标题】:Why does simple C++ vector function produce subscript out of bounds? [duplicate]为什么简单的 C++ 向量函数会产生越界的下标? [复制] 【发布时间】:2017-03-24 06:16:37 【问题描述】:

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

#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,而迭代器不指向vector.end(),应该是整个vector。

【问题讨论】:

你在使用前没有定义vector的大小或者使用vector容器的push_back函数 vector&lt;int&gt; a = 3, 5, 6, 1; 会更简单一些,更不用说;实际上会起作用;) 【参考方案1】:

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

【讨论】:

【参考方案2】:

这将解决您的问题:

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

【讨论】:

以上是关于为啥简单的 C++ 向量函数会产生越界的下标? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

向量下标超出范围错误 - C++ Vectors & Open CV

为啥这个看似简单的 C++ 代码会产生分段错误?

向量下标超出范围 C++ 合并排序

为啥python的列表切片不会产生索引越界错误? [复制]

为啥不能在 2D 向量中 push_back? C++