我在这个for循环的第一次迭代中得到了堆栈溢出
for (int q = 0; q < SIZEN; q++) { cout<<nList[q]<<" "; }
nList是int类型的向量,包含376个项目 . nList的大小取决于程序中定义的常量 . 该程序适用于高达376的每个值,然后在376之后它停止工作 .
有什么想法吗?
如果您通过使用例如push_back向向量添加了376个元素,则通常情况下,值大于376的访问会导致程序失败,您正在访问肯定未初始化且未受管理的内存 .
如果"stops working",你的意思是崩溃,那么你可能正在读取超过缓冲区的末尾 . vector::operator[] 未进行范围检查,因此它可以让你自己射击 .
vector::operator[]
如果要遍历向量,请使用迭代器,或至少 nList.size() .
nList.size()
因此,对代码的修改最少:
for (int q = 0; q < nList.size(); q++) { cout << nList[q] << " "; }
或者使用迭代器
for (std::vector<int>::const_iterator it = nList.begin(); it != nList.end(); ++it) { cout << *it << " "; }
我在这里的初步猜测是向量小于376. [] 运算符没有任何关于运行实际向量边界的guaratees . 如果使用 at 函数,你会更安全,更安全:
[]
at
for(int i=0; i < nList.size(); ++i){ cout << nList.at(q) << " "; }
在那里,如果 q 在向量之外,它将帮助诊断这种类型的运行时问题 .
q
3 回答
如果您通过使用例如push_back向向量添加了376个元素,则通常情况下,值大于376的访问会导致程序失败,您正在访问肯定未初始化且未受管理的内存 .
如果"stops working",你的意思是崩溃,那么你可能正在读取超过缓冲区的末尾 .
vector::operator[]
未进行范围检查,因此它可以让你自己射击 .如果要遍历向量,请使用迭代器,或至少
nList.size()
.因此,对代码的修改最少:
或者使用迭代器
我在这里的初步猜测是向量小于376.
[]
运算符没有任何关于运行实际向量边界的guaratees . 如果使用at
函数,你会更安全,更安全:在那里,如果
q
在向量之外,它将帮助诊断这种类型的运行时问题 .