首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言動態二維陣列的兩種實現方式詳解

     編輯:關於C語言

C語言動態二維陣列的兩種實現方式詳解

在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 避免整數溢位

掌握這兩種模式,能讓你在嵌入式系統、高效能運算等場合靈活選擇最適合的記憶體佈局策略。

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