首页 文章

堆栈溢出访问大矢量

提问于
浏览
1

我在这个for循环的第一次迭代中得到了堆栈溢出

for (int q = 0; q < SIZEN; q++)
{
    cout<<nList[q]<<" ";
}

nList是int类型的向量,包含376个项目 . nList的大小取决于程序中定义的常量 . 该程序适用于高达376的每个值,然后在376之后它停止工作 .

有什么想法吗?

3 回答

  • 0

    如果您通过使用例如push_back向向量添加了376个元素,则通常情况下,值大于376的访问会导致程序失败,您正在访问肯定未初始化且未受管理的内存 .

  • 6

    如果"stops working",你的意思是崩溃,那么你可能正在读取超过缓冲区的末尾 . vector::operator[] 未进行范围检查,因此它可以让你自己射击 .

    如果要遍历向量,请使用迭代器,或至少 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 << " ";
    }
    
  • 1

    我在这里的初步猜测是向量小于376. [] 运算符没有任何关于运行实际向量边界的guaratees . 如果使用 at 函数,你会更安全,更安全:

    for(int i=0; i < nList.size(); ++i){
      cout << nList.at(q) << " ";
    }
    

    在那里,如果 q 在向量之外,它将帮助诊断这种类型的运行时问题 .

相关问题