我得到一個堆棧溢出上的這第一次迭代的for循環堆棧溢出訪問的大載體
for (int q = 0; q < SIZEN; q++)
{
cout<<nList[q]<<" ";
}
NLIST是376個項目類型爲int的載體。 nList的大小取決於程序中定義的常量。該程序適用於每個值高達376,然後在376之後停止工作。
有什麼想法?
我得到一個堆棧溢出上的這第一次迭代的for循環堆棧溢出訪問的大載體
for (int q = 0; q < SIZEN; q++)
{
cout<<nList[q]<<" ";
}
NLIST是376個項目類型爲int的載體。 nList的大小取決於程序中定義的常量。該程序適用於每個值高達376,然後在376之後停止工作。
有什麼想法?
如果通過「停止工作」,你的意思是崩潰,那麼你可能正在讀緩衝區的末尾。 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 << " ";
}
我最初在這裏猜測是矢量小於376. []
運營商不作爲guaratees遍歷實際的向量邊界。你會非常非常安全,如果您使用的at
功能:
for(int i=0; i < nList.size(); ++i){
cout << nList.at(q) << " ";
}
那裏,如果q
是它會拋出一個異常向量之外。這將有助於診斷這種類型的運行時問題。
如果通過使用例如push_back將376個元素添加到矢量中,那麼使用值高於376的訪問會導致程序失敗,這是正常的,但您確實在訪問未初始化的內存和未管理的內存。
顯示如何填充和定義nList。 – 2010-04-25 13:05:18
376項目是沒有辦法「大」:)。 – kennytm 2010-04-25 13:06:55
使用nList.size()代替SIZEN作爲循環控制條件會不會更好? – 2010-04-25 13:08:14