在C語言程式設計中,動態二維陣列的建立是一項核心技能。本文將深入解析兩種主流實現思路:基於指標陣列的「指標的指標」法,以及基於連續記憶體區塊的「一維陣列模擬」法,並提供完整的可執行程式碼範例。
思路一:指標陣列(二級指針)
此法先分配一個指標陣列,每個元素指向一行資料。記憶體分布不連續,但語法直觀,支援 p[i][j] 形式存取。
思路二:單一連續區塊(一維陣列模擬)
一次性分配 m*n 個整數空間,透過 p[i*n+j] 計算索引。記憶體連續,快取效率高,釋放只需一次 free()。
#include <stdio.h>
#include <stdlib.h>
#define MIND 1 // 定義為1使用思路一,註釋掉使用思路二
int main() {
int m, n, i, j;
printf("請輸入二維陣列的行數:");
scanf("%d", &m);
printf("請輸入二維陣列的列數:");
scanf("%d", &n);
#ifndef MIND
// 思路二:連續記憶體區塊
printf("思路二:連續記憶體區塊\n");
int *p = (int *)calloc(m * n, sizeof(int));
printf("請輸入二維陣列各元素:\n");
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
scanf("%d", p + i * n + j);
printf("\n二維陣列(行:%d 列:%d):\n", m, n);
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j)
printf("%6d", *(p + i * n + j));
printf("\n");
}
free(p);
#else
// 思路一:指標陣列
printf("思路一:指標陣列\n");
int **p = (int **)calloc(m, sizeof(int *));
for (i = 0; i < m; ++i)
p[i] = (int *)calloc(n, sizeof(int));
printf("請輸入二維陣列各元素:\n");
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
scanf("%d", &p[i][j]);
printf("\n二維陣列(行:%d 列:%d):\n", m, n);
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j)
printf("%6d", p[i][j]);
printf("\n");
}
// 由內而外釋放記憶體
for (i = 0; i < m; ++i)
free(p[i]);
free(p);
#endif
return 0;
}
| 特性 | 指標陣列法 | 連續區塊法 |
|---|---|---|
| 記憶體分布 | 不連續 | 連續 |
| 存取語法 | p[i][j] | p[i*n+j] |
| 分配次數 | m+1 次 | 1 次 |
| 釋放複雜度 | 需循環釋放 | 單次 free |
| 快取友好度 | 較差 | 優秀 |
int** 介面的函式時,使用指標陣列法calloc/malloc 回傳值,防止記憶體不足導致崩潰size_t 避免整數溢位掌握這兩種模式,能讓你在嵌入式系統、高效能運算等場合靈活選擇最適合的記憶體佈局策略。