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

C 語言冒泡排序新手錯誤:cin>>a[10] 越界訪問導致程序崩潰

     編輯:程式設計疑難解答

錯誤代碼分析

int a[10];
cin >> a[10];  // ❌ 致命錯誤:訪問 a[10] 越界

// 正確理解:
// a[10] 表示第 11 個元素(索引 10)
// 數組 a[10] 合法索引為 0~9
// 此處導致未定義行為,通常表現為「程序停止工作」

正確的輸入方式

方式一:循環逐個輸入

int a[10];
for (int i = 0; i < 10; i++) {
    cin >> a[i];  // 依次輸入 a[0] 到 a[9]
}

方式二:初始化列表(已知數據)

int a[10] = {1, 3, 2, 6, 8, 4, 5, 7, 10, 9};

方式三:動態輸入數量

int n;
cin >> n;  // 先輸入元素個數
vector a(n);
for (int i = 0; i < n; i++) {
    cin >> a[i];
}

完整冒泡排序正確實現

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cout << "請輸入元素個數 (≤100): ";
    cin >> n;
    
    if (n <= 0 || n > 100) {
        cout << "個數無效" << endl;
        return 1;
    }
    
    vector a(n);
    cout << "請輸入 " << n << " 個整數: ";
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    
    // 冒泡排序:優化版(提前終止)
    for (int i = 0; i < n - 1; i++) {
        bool swapped = false;
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                swap(a[j], a[j + 1]);
                swapped = true;
            }
        }
        if (!swapped) break; // 本輪無交換,已有序
    }
    
    cout << "排序結果: ";
    for (int i = 0; i < n; i++) {
        cout << a[i] << (i == n-1 ? "\n" : " ");
    }
    return 0;
}

關鍵知識點總結

概念正確理解常見錯誤
數組聲明int a[10] 分配 10 個 int,索引 0~9以為分配 11 個或索引 1~10
越界訪問未定義行為:崩潰、靜默錯誤、看似正常認為有邊界檢查(C/C++ 無)
cin 輸入需明確目標索引 cin >> a[i]cin >> a[10] 或 cin >> a
冒泡排序雙層循環,內層 j < n-1-i邊界寫錯、未優化、交換邏輯錯

調試技巧

  1. 編譯加旗標:g++ -fsanitize=address -g main.cpp 運行時檢測越界
  2. IDE 斷點:觀察 a 內存地址、循環變量值
  3. 打印調試:關鍵步驟輸出數組狀態

學習建議

  • ✅ 從 vector 開始:自動管理內存、支持 at() 邊界檢查
  • ✅ 理解指針與數組關係:a[i] == *(a+i)
  • ✅ 練習手寫排序:選擇、插入、快排,理解遞歸與分治
  • ✅ 閱讀《C Primer Plus》《C++ Primer》建立系統知識
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved