首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言定義全零 N×N 陣列:靜態與動態分配完整指南

     編輯:程式設計疑難解答

需求

在 C 語言中定義一個全零的 N 行 N 列 二維陣列,類似 MATLAB zeros(n,1) 或 zeros(n,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(靜態儲存期規則延伸至聚合體初始化)。

方案二:動態分配(執行期決定 N,或 N 較大避免棧溢位)

方法 A:連續記憶體塊(單次 malloc,存取效率高)

#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 友好。

方法 B:分行分配(傳統寫法,釋放較繁瑣)

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;
}

方案三:變長陣列 (VLA, C99,僅限棧上小型矩陣)

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} 保證歸零,分配與釋放成對出現,大物件上堆不上棧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved