錯誤代碼分析
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 | 邊界寫錯、未優化、交換邏輯錯 |
調試技巧
- 編譯加旗標:
g++ -fsanitize=address -g main.cpp 運行時檢測越界
- IDE 斷點:觀察
a 內存地址、循環變量值
- 打印調試:關鍵步驟輸出數組狀態
學習建議
- ✅ 從
vector 開始:自動管理內存、支持 at() 邊界檢查
- ✅ 理解指針與數組關係:
a[i] == *(a+i)
- ✅ 練習手寫排序:選擇、插入、快排,理解遞歸與分治
- ✅ 閱讀《C Primer Plus》《C++ Primer》建立系統知識