2010-04-25 132 views
1

我得到一個堆棧溢出上的這第一次迭代的for循環堆棧溢出訪問的大載體

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

NLIST是376個項目類型爲int的載體。 nList的大小取決於程序中定義的常量。該程序適用於每個值高達376,然後在376之後停止工作。

有什麼想法?

+0

顯示如何填充和定義nList。 – 2010-04-25 13:05:18

+5

376項目是沒有辦法「大」:)。 – kennytm 2010-04-25 13:06:55

+1

使用nList.size()代替SIZEN作爲循環控制條件會不會更好? – 2010-04-25 13:08:14

回答

6

如果通過「停止工作」,你的意思是崩潰,那麼你可能正在讀緩衝區的末尾。 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是它會拋出一個異常向量之外。這將有助於診斷這種類型的運行時問題。

0

如果通過使用例如push_back將376個元素添加到矢量中,那麼使用值高於376的訪問會導致程序失敗,這是正常的,但您確實在訪問未初始化的內存和未管理的內存。