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

C 語言數組插入排序:邊界條件導致越界訪問的修正

     編輯:程式設計綜合問答

問題代碼片段

// 原代碼查找插入位置循環:
for(i=1; i<=8; i++) {
    if(num > count[i] && num <= count[i+1]) // i=8 時 count[9] 越界!
        index = i;
}

錯誤原因

數組 count[9] 下標合法範圍 0~8(或代碼中 1~8)。循環到 i=8 時,count[i+1] 即 count[9] 越界訪問,導致未定義行為(程序卡死、崩潰、輸出亂碼)。

修正邏輯:利用已排序數組特性,單向比較即可

數組已按降序排列(大→小)。插入 num 只需找到第一個小於 num 的位置,即為插入點。

修正代碼

// 修正查找插入位置
index = 9; // 默認插到最後
for(i = 1; i <= 8; i++) {
    if (num > count[i]) { // 找到第一個比 num 小的元素
        index = i;
        break;
    }
}
// 若 num 最小,index 保持 9(插到末尾)

// 後移元素騰出位置
for(i = 8; i >= index; i--) {
    count[i+1] = count[i];
}
count[index] = num; // 插入

完整流程總結

  1. 輸入 8 個數存入 count[1..8]。
  2. 降序排序(冒泡/選擇/快排均可)。
  3. 輸入待插入數 num。
  4. 遍歷尋找 count[i] < num 的第一個 i 作為插入位置 index。
  5. index..8 後移一位,count[index] = num。
  6. 輸出 9 個數。

邊界測試用例

原數組(降序)插入值預期結果
90 80 70 60 50 40 30 209595 90 80 70 60 50 40 30 20 (index=1)
90 80 70 60 50 40 30 205590 80 70 60 55 50 40 30 20 (index=5)
90 80 70 60 50 40 30 201090 80 70 60 50 40 30 20 10 (index=9)
90 80 70 60 50 40 30 207090 80 70 70 60 50 40 30 20 (index=3, 穩定性視需求)

避坑指南

  • 數組下標循環邊界務必嚴謹:i < n 或 i <= n-1,切勿訪問 a[n]。
  • 利用已知有序性簡化邏輯:降序數組插入只需「找第一個比自己小的」。
  • 調試時打印關鍵下標、值,定位越界位置。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved