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

C++ sort 導致 segmentation fault:變量被循環修改後未重置

     編輯:程式設計疑難解答

錯誤代碼片段

while(nm--) { cin >> ptr[i]; ++i; }
sort(ptr, ptr + nm); // nm 此時為 -1 (或 0)

原因

循環 `while(nm--)` 將 `nm` 遞減至 **-1** (或 0,視初始值)。隨後 `sort(ptr, ptr + nm)` 傳入負長度/零長度,導致未定義行為 (段錯誤)。

修正

int count = n * m;
int *ptr = new int[count];
for (int i = 0; i < count; ++i) cin >> ptr[i];
sort(ptr, ptr + count); // 使用原始 count
// ... 後續邏輯
delete[] ptr;

關鍵教訓

  • **不要在循環中修改原始長度變量**,用副本或 `for` 循環。
  • C++ 推薦用 `std::vector` 自動管理記憶體,避免手動 `new/delete`。`vector` 知曉自身大小,`sort(v.begin(), v.end())` 簡潔安全。
  • 調試段錯誤:編譯加 `-g -fsanitize=address` (GCC/Clang) 或 VS 開啟「啟用地址消毒器」,精確定位越界位置。

現代 C++ 寫法

int n, m, k;
while (cin >> n >> m >> k) {
    if (n < 1 || n > 10 || m < 1 || m > 100 || k < 1 || k > n * m) break;
    vector a(n * m);
    for (int &x : a) cin >> x;
    nth_element(a.begin(), a.begin() + k - 1, a.end()); // O(N) 找第 k 小,比全排序快
    cout << "Scenario #" << set++ << "\n" << a[k-1] << "\n";
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved