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

C 語言動態二維數組實現:指針數組 + 連續內存塊

     編輯:C 語言基礎

核心原理

C 無真正二維數組,p[i][j] 編譯器展開為 *(*(p+i)+j)。動態分配需兩步:

  1. 分配**行指針數組**(void **)
  2. 分配**連續數據塊**,再將行指針指向對應偏移

通用實現(支援任意類型)

typedef unsigned char MK_Byte;
#define SUCCESS 0
#define MNOMEMORY 2

#define DeclareTwoDArray(TYPE, name) TYPE **name = NULL
#define MKMALLOC(sz) malloc(sz)
#define MKFREE(ptr) do { if (ptr) { free(ptr); ptr = NULL; } } while(0)

int MKCreateArray(int elemSize, int cols, int rows, void ***out) {
    void **rowPtr = (void**)MKMALLOC(sizeof(void*) * rows);
    if (!rowPtr) return MNOMEMORY;
    
    MK_Byte *data = (MK_Byte*)MKMALLOC(elemSize * cols * rows);
    if (!data) { MKFREE(rowPtr); return MNOMEMORY; }
    
    memset(data, 0, elemSize * cols * rows);
    for (int i = 0; i < rows; i++)
        rowPtr[i] = data + i * cols * elemSize;
    
    *out = rowPtr;
    return SUCCESS;
}

void MKFreeArray(void ***arr) {
    if (*arr) {
        MKFREE((*arr)[0]);  // 釋放數據塊
        MKFREE(*arr);       // 釋放行指針數組
    }
}

使用示例

void test() {
    DeclareTwoDArray(int, a);
    DeclareTwoDArray(float, b);
    
    MKCreateArray(sizeof(int), 3, 2, (void***)&a);
    a[1][2] = 10; a[0][1] = 23;
    printf("%d,%d\n", a[1][2], a[0][1]);
    MKFreeArray((void***)&a);
    
    MKCreateArray(sizeof(int), 6, 6, (void***)&a);  // 重新分配
    a[5][5] = 234;
    MKFreeArray((void***)&a);
    
    MKCreateArray(sizeof(float), 2, 2, (void***)&b);
    b[0][0] = 0.5f; b[1][1] = 0.006f;
    MKFreeArray((void***)&b);
}

優勢

  • 單次 malloc 分配數據塊,**緩存友好**、釋放簡單
  • 宏封裝類型大小,**泛型復用**
  • 行指針數組 + 連續塊 = 標準 arr[i][j] 語法直用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved