C 無真正二維數組,p[i][j] 編譯器展開為 *(*(p+i)+j)。動態分配需兩步:
void **)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] 語法直用