void Table(int k, int **a, int C) { ... }
int main() {
int k = 3;
Table(k, a); // 錯誤:a 未聲明,參數不匹配
}
int **a(二級指針),但 main 中未聲明 a,且調用時少傳第三個參數 C。int a[N][N] 是二維數組,退化為 int (*)[N](指向數組的指針),不是 int**。
// 函數聲明
void Table(int k, int a[][N], int C); // 或 int (*a)[N]
// main 中
int a[N][N] = {0};
Table(k, a, 0); // 傳入二維數組名,自動退化為 int (*)[N]
int main() {
int k = 3;
// 分配行指針數組
int **a = (int**)malloc(N * sizeof(int*));
for (int i = 0; i < N; i++) {
a[i] = (int*)malloc(N * sizeof(int));
}
Table(k, a, 0);
// 釋放
for (int i = 0; i < N; i++) free(a[i]);
free(a);
}
代碼實現 2^k 名選手循環賽日程表(分治法):
1..n。m 為當前塊大小,每輪翻倍 1, 2, 4...。int a[N][N] 而非 int **a。int a[][N] 或 int (*a)[N]。a(數組名),補齊第三個參數(即使不使用也要佔位)。a[i][j] 訪問,無需二級指針解引用。
// 修正後完整主函數
#define N 8
int a[N][N];
void Table(int k, int a[][N], int C) {
// ... 原邏輯,直接用 a[i][j]
}
int main() {
int k = 3;
Table(k, a, 0); // 正確調用
// 打印驗證
for (int i = 1; i <= 8; i++) {
for (int j = 1; j <= 8; j++) printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
理解「二維數組 ≠ 二級指針」,正確匹配函數參數類型,是 C 語言避免段錯誤的關鍵。