为啥简单的 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<int> a = 3, 5, 6, 1;
会更简单一些,更不用说;实际上会起作用;)
【参考方案1】:
vector<int> a;
创建一个空向量,并且由于它是空的(即没有元素),使用 a[index]
访问元素始终是越界访问,这会导致未定义的行为,并且在您的情况下,崩溃。使用push_back
或emplace_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++ 标准向量在分配或调整大小时会出现段错误? [关闭]