在 C 語言中定義一個全零的 N 行 N 列 二維陣列,類似 MATLAB zeros(n,1) 或 zeros(n,n)。
#define N 10 // 或 const int N = 10;
int main() {
int a[N][N] = {0}; // C 標準:初始化器 {0} 會將所有元素置 0
// 驗證
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf("%d\t", a[i][j]);
printf("\n");
}
return 0;
}
原理:{0} 為第一個元素顯式初始化為 0,其餘元素依 C 標準自動初始化為 0(靜態儲存期規則延伸至聚合體初始化)。
#include <stdlib.h>
int **create_matrix(int n) {
// 分配指標陣列
int **matrix = (int **)malloc(n * sizeof(int *));
if (!matrix) return NULL;
// 分配連續資料區
int *data = (int *)calloc(n * n, sizeof(int)); // calloc 自動歸零
if (!data) { free(matrix); return NULL; }
// 建立行指標
for (int i = 0; i < n; i++)
matrix[i] = data + i * n;
return matrix;
}
void free_matrix(int **matrix) {
if (matrix) {
free(matrix[0]); // 釋放資料區
free(matrix); // 釋放指標陣列
}
}
優點:記憶體連續,matrix[i][j] 存取無雙重間接,cache 友好。
int **create_matrix_v2(int n) {
int **matrix = (int **)malloc(n * sizeof(int *));
if (!matrix) return NULL;
for (int i = 0; i < n; i++) {
matrix[i] = (int *)calloc(n, sizeof(int));
if (!matrix[i]) {
for (int k = 0; k < i; k++) free(matrix[k]);
free(matrix);
return NULL;
}
}
return matrix;
}
void process(int n) {
int a[n][n]; // VLA,自動儲存期,不自動歸零
memset(a, 0, sizeof(a)); // 需手動歸零
// 使用 a...
} // 離開作用域自動釋放
警告:大尺寸 VLA 易導致棧溢位,嵌入式或高併發環境慎用。
int a[N][N]; 未初始化 → 元素為垃圾值。int **a = malloc(N * sizeof(int*)); 只分配指標陣列,忘記為每行分配資料區 → 解引用崩潰。free(a) 未釋放 a[i] → 記憶體洩漏。| 場景 | 推薦方式 |
|---|---|
| N 編譯期常數,較小(< 1000) | int a[N][N] = {0}; |
| N 執行期決定,或大矩陣 | 連續 calloc + 指標陣列(方法 A) |
| 需頻繁建立/銷毀,效能敏感 | 記憶體池 / 物件池預分配 |
核心原則:優先用 calloc 或 {0} 保證歸零,分配與釋放成對出現,大物件上堆不上棧。