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

C 語言桶子排序陷阱:輸入值超出陣列邊界導致程式崩潰

     編輯:程式設計綜合問答

問題程式碼

int book[11], i, t, j;
for (i = 0; i < 11; i++) book[i] = 0;
for (i = 0; i < 11; i++) {
    scanf("%d", &t);
    book[t]++;  // 危險:t 可能超出 0~10
}

崩潰原因

  • book 大小為 11,合法索引 0~10。
  • 若使用者輸入 t = 15 或負數,book[t] 存取越界,觸發未定義行為(通常為段錯誤/程式停止運作)。
  • 桶子排序前提:輸入資料範圍已知且較小,需預先驗證輸入值落在陣列索引範圍內。

修正版本

#define MAX_VAL 10
int book[MAX_VAL + 1] = {0};
int t;
for (int i = 0; i < 11; i++) {
    if (scanf("%d", &t) != 1) break;
    if (t < 0 || t > MAX_VAL) {
        fprintf(stderr, "輸入值 %d 超出範圍 0~%d,忽略\n", t, MAX_VAL);
        continue;
    }
    book[t]++;
}

桶子排序適用場景與限制

優點缺點
時間複雜度 O(n+k),極快需知資料範圍,且範圍不可過大(記憶體限制)
穩定排序不適用浮點數、字串等非整數鍵值
實作簡單資料分佈極不均時空間浪費大

進階建議

  • 輸入範圍未知時,改用 qsort 或 std::sort (C++)。
  • 大範圍整數可用基數排序(Radix Sort)避免巨大陣列。
  • 競賽題目若保證輸入合法,可省略檢查以提速;實務專案務必加入防禦性程式設計。

記住:陣列索引越界是 C/C++ 程式崩潰的頭號殺手,輸入驗證不可省略。

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