結構體包含 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 個 * ?
}
point[0] 是第一行 (80 個 char),不可能在單一 char 元素中包含 3 個字元。請確認除錯輸出邏輯:是否誤將 point[0] 整行列印為字串,導致視覺上看到 `*`?i <= 19 (0~19)、j <= 79 (0~79) 完全符合 [20][80],無越界。point[1][1]、[1][2]、[1][3] 皆在合法範圍。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` 列印非結尾字串導致跨行讀取,非記憶體錯誤。