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

C 結構體二維陣列初始化:迴圈賦值導致資料異常的索引邊界檢查

     編輯:程式設計綜合問答

結構體包含 char point[20][80],雙層迴圈初始化後,手動設定 point[1][1..3] = '*' 卻發現 point[0] 也出現 `*`,疑似記憶體越界或索引理解偏差。

代碼片段

struct qipan {
    char point[20][80];
    bool isClear;
} board;

int main() {
    for (int i = 0; i <= 19; i++)
        for (int j = 0; j <= 79; j++)
            board.point[i][j] = ' '; // 全部設為空格

    board.point[1][1] = board.point[1][2] = board.point[1][3] = '*';
    // 觀察:point[0] 也出現 3 個 * ?
}

關鍵檢查點

  1. 觀察方式是否正確?
    point[0] 是第一行 (80 個 char),不可能在單一 char 元素中包含 3 個字元。請確認除錯輸出邏輯:是否誤將 point[0] 整行列印為字串,導致視覺上看到 `*`?
  2. 迴圈邊界正確:i <= 19 (0~19)、j <= 79 (0~79) 完全符合 [20][80],無越界。
  3. 手動賦值索引正確:point[1][1]、[1][2]、[1][3] 皆在合法範圍。
  4. 結構體記憶體佈局:point 連續 1600 bytes,緊接著 isClear。無重疊。

常見誤讀場景

// 錯誤觀察代碼
printf("%s\n", board.point[0]); // 若 point[0] 未以 \0 結尾,會繼續讀取 point[1] 內容,直到遇到 \0
// 若 point[1][1..3] = '*',且 point[0] 全空格(無\0),輸出會包含 point[1] 的 *

修正建議

  • 初始化時補上結束符:board.point[i][79] = '\0'; (或用 memset(board.point, ' ', sizeof(board.point)) 後逐行設 \0)。
  • 或改用 std::array<std::array<char, 80>, 20> (C++) 避免裸陣列陷阱。
  • 除錯時逐元素檢查:for(j) printf("%c", board.point[0][j]); 而非 %s。

結論:代碼邏輯無誤,異常源於以 `%s` 列印非結尾字串導致跨行讀取,非記憶體錯誤。

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