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

C 語言指針數組排序字符串:越界訪問導致運行崩潰的經典錯誤

     編輯:程式設計疑難解答

代碼編譯通過但運行崩潰,典型原因是循環條件寫錯導致指針越界訪問未初始化內存。

錯誤代碼分析

char* p[4] = {"asdf","xczv","df","gr"};
for (int i = 0; i < 4; i++) {        // 外層 0~3
    for (int j = 0; j < 4; j++) {    // 內層 0~3
        if (strcmp(p[j], p[j+1]) > 0) // j=3 時 p[4] 越界!

修正版

for (int i = 0; i < 3; i++) {        // 外層只需 n-1 輪
    for (int j = 0; j < 3 - i; j++) { // 內層遞減,避免重複比較
        if (strcmp(p[j], p[j+1]) > 0) {
            char* temp = p[j]; p[j] = p[j+1]; p[j+1] = temp;
        }
    }
}

調試技巧

  • 崩潰時查看調用堆棧,定位到 strcmp 行
  • 添加邊界檢查:assert(j+1 < 4)
  • 使用靜態分析工具(如 Cppcheck、VS 代碼分析)提前發現

冒泡排序內層上限應為 n - 1 - i,這是教科書級邊界條件,必須刻入肌肉記憶。

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