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

C 語言冒泡排序邊界錯誤導致第二次排序出現 0:迴圈條件 `j < 4-i` 應為 `j < 3-i`,避免陣列越界讀取未初始化記憶體

     編輯:程式設計疑難解答

代碼片段:


for(i=0;i<4;i++) {
    for(j=0;j<4-i;j++)   // 錯誤:當 i=0, j=3 時,a[j+1] 即 a[4] 越界
        if(a[j]>a[j+1]) { k=a[j]; a[j]=a[j+1]; a[j+1]=k; }
}

錯誤分析

  • 陣列 `a[4]` 合法索引 0~3。
  • 外層 `i=0` 時,內層 `j` 最大為 3,`a[j+1]` → `a[4]` **越界讀取**。
  • 越界值不定(通常為堆疊殘留的 0),導致最大值被 0 取代,排序結果出現 0。

正確邊界

冒泡排序每輪將最大值「冒泡」到末尾,第 `i` 輪只需比較前 `n-1-i` 對相鄰元素:


for (i = 0; i < 4 - 1; i++) {        // 外層只需 n-1 輪
    for (j = 0; j < 4 - 1 - i; j++) { // 內層 j 最大 n-2-i,j+1 最大 n-1-i
        if (a[j] > a[j+1]) { swap... }
    }
}

第二次排序同理修正


for(i=0;i<5-1;i++) {
    for(j=0;j<5-1-i;j++) { ... }
}

良好習慣

  • 使用 `sizeof(a)/sizeof(a[0])` 計算長度,避免魔術數字。
  • 編譯器開啟 `-Wall -Wextra -fsanitize=address`(GCC/Clang)可在執行時檢測越界。
  • 單步除錯觀察 `j`、`j+1` 索引值,立即發現越界。

修正邊界後,兩次排序均正常,不再出現莫名的 0。

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