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

C 語言二維動態數組:雙重指針 malloc 完整模板與釋放指南

     編輯:程式設計疑難解答

核心思路:指針數組 + 每行獨立分配

二維動態數組本質是「行指針數組」,每個元素指向一塊獨立的連續內存(該行數據)。

標準實現代碼

int **p;
int M = 10, N = 20; // 行、列
int i;

// 1. 分配行指針數組
p = (int **)malloc(sizeof(int *) * M);
if (!p) exit(1);

// 2. 為每行分配數據空間
for (i = 0; i < M; i++) {
    p[i] = (int *)malloc(sizeof(int) * N);
    if (!p[i]) {
        // 分配失敗:釋放已分配的行
        for (int j = 0; j < i; j++) free(p[j]);
        free(p);
        exit(1);
    }
}

// 3. 使用:p[row][col] 訪問
p[3][5] = 100;

// 4. 釋放:先釋放每行,再釋放行指針數組
for (i = 0; i < M; i++) free(p[i]);
free(p);
p = NULL; // 防野指針

替代方案:連續內存塊(單次 malloc)

優點:內存連續、緩存友好、釋放只需一次 free。

// 分配
int *data = (int *)malloc(sizeof(int) * M * N);
int **p = (int **)malloc(sizeof(int *) * M);
for (i = 0; i < M; i++) p[i] = data + i * N;

// 使用同樣 p[i][j]

// 釋放
free(data);
free(p);

常見錯誤避坑

  • 忘記檢查 malloc 返回值:導致空指針解引用崩潰。
  • 釋放順序錯誤:先 free(p) 再釋放行 → 內存洩漏(行指針丟失)。
  • 混淆 int *[M] 與 int **:前者是定長數組(棧上),後者是動態指針(堆上)。
  • 未置 NULL:釋放後指針懸空,二次釋放或誤用崩潰。

適用場景選擇

方案優點缺點適用
雙重指針每行長度可不同、擴容靈活內存不連續、多次 malloc 慢、釋放繁瑣不規則矩陣、頻繁增減行
連續塊高效、緩存友好、簡單釋放行長固定、擴容需整體遷移矩陣運算、圖像處理、高性能計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved