首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 容器指針遍歷:for 循環條件判斷錯誤導致越界

     編輯:程式設計疑難解答

錯誤代碼

int *p = container.data(); // 假設指向容器內部數組
for (; p != nullptr; ++p) { // 錯誤:p 永遠不會為 nullptr
    // 使用 *p
}

根因

指針 `p` 初始指向有效內存地址(非 `nullptr`),`++p` 只會遞增地址,永遠不會變為 `nullptr`**。循環條件 `p != nullptr` 永真,導致越界訪問,直到段錯誤。

正確遍歷模式

1. 索引下標(最通用)

for (size_t i = 0; i < container.size(); ++i) {
    auto &elem = container[i];
}

2. 迭代器(標準庫風格)

for (auto it = container.begin(); it != container.end(); ++it) {
    auto &elem = *it;
}

3. 范圍 for (C++11,最推薦)

for (auto &elem : container) {
    // 直接使用 elem
}

4. 指針 + 邊界(僅適用於連續內存容器 vector/array/string)

int *begin = container.data();
int *end = begin + container.size(); // 尾後指針
for (int *p = begin; p != end; ++p) {
    // 使用 *p
}

核心概念:尾後指針/迭代器

C++ 標準庫約定:**`end()` / `data()+size()` 指向「最後一個元素之後」的位置**,不解引用,僅作邊界哨兵。循環條件永遠是 `it != end` 或 `p != end`。

避坑清單

  • ❌ `p != nullptr` 判斷指針遍歷結束(除非容器專門在末尾放 `nullptr` 哨兵,極罕見)。
  • ❌ `p <= end` 指針比較(標準僅保證 `==`/`!=`,不保證 `<`/`>` 有意義)。
  • ✅ 使用標準庫容器的 `begin()`/`end()` 或范圍 for。
  • ✅ 原始數組傳遞時,**同時傳遞指針和長度**,或用 `std::span` (C++20)。

**現代 C++ 盡量不直接裸指針遍歷,擁抱迭代器與范圍 for,安全又高效。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved