#define N 3, M 4 反了、行優先儲存導致邏輯錯誤
#define N 3
#define M 4
static int a[N][M] = {
{1,2,3},
{4,15,6},
{12,18,9},
{10,11,2}
}; // 初始化列表有 4 列 3 行,但 N=3, M=4 宣告為 3 行 4 列 → 不匹配
#define N 3, M 4 宣告 a[3][4] → **3 行 4 列**,與資料維度**反了**。i < N、j < M 遍歷錯誤區域。
#include
#define ROWS 4 // 行數
#define COLS 3 // 列數
int main(void) {
static int a[ROWS][COLS] = {
{1, 2, 3},
{4, 15, 6},
{12, 18, 9},
{10, 11, 2}
};
int sum = 0;
// 邊界元素:第一行、最後一行、第一列(中間)、最後一列(中間)
for (int j = 0; j < COLS; j++) {
sum += a[0][j]; // 第一行
sum += a[ROWS-1][j]; // 最後一行
}
for (int i = 1; i < ROWS-1; i++) {
sum += a[i][0]; // 第一列 (排除角落已加)
sum += a[i][COLS-1]; // 最後一列
}
printf("邊界元素和 = %d\n", sum); // 預期 60
return 0;
}
int border_sum(int rows, int cols, int a[rows][cols]) {
if (rows <= 0 || cols <= 0) return 0;
if (rows == 1) { // 單行
int s = 0;
for (int j = 0; j < cols; j++) s += a[0][j];
return s;
}
if (cols == 1) { // 單列
int s = 0;
for (int i = 0; i < rows; i++) s += a[i][0];
return s;
}
int sum = 0;
for (int j = 0; j < cols; j++) { sum += a[0][j]; sum += a[rows-1][j]; }
for (int i = 1; i < rows-1; i++) { sum += a[i][0]; sum += a[i][cols-1]; }
return sum;
}
| 宣告 | 含義 | 記憶體佈局 |
|---|---|---|
int a[4][3] | 4 行、3 列 | 連續 12 個 int:row0(col0,1,2), row1(...), row2(...), row3(...) |
int a[3][4] | 3 行、4 列 | 連續 12 個 int:row0(col0..3), row1(...), row2(...) |
| 初始化列表 | 外層大括號 = 行,內層 = 列 | {{r0c0,r0c1},{r1c0,r1c1}} → 2 行 2 列 |
**「外層大括號數 = 行數 = 第一維」,「內層元素數 = 列數 = 第二維」**。寫 #define ROWS ... COLS ... 替代 N,M,語意自明、不易反。