2012年12月25日火曜日

Cによる2次元配列のメモリ管理を2つの実装で


Cで2次元配列のメモリの割り当てと解放を行うmallocとfreeを2つの方式で実装してみる。


◆ 実装1
● 概要
1次元配列に各配列のアドレスを保存し、
各配列ごとに新しく配列を作っていく。


● メモリの割り当てイメージ

□□□□□
□□□□□
□□□□□

下の方がイメージつきやすいか。
□□□□□
□□□□□
□□□□□


● コード ※例外処理は省略
int** my2dMalloc(int rows, int cols) {
int** rowptr;
int i;
rowptr = malloc(rows * sizeof(int *));
for(i = 0; i < rows; i++) {
rowptr[i] =malloc(cols * sizeof(int));
}
}

void my2dFree(int ** rowptr, int rows) {
int i;
for(i = 0; i < rows; i++) {
free(rowptr[i]);
}
free(rowptr);
}



◆ 実装2
● 概要
各配列のポインタを保存する配列と、
各配列を連続した1ブロックに割り当てる。


● メモリの割り当てイメージ
□□□□□ □□□□□ □□□□□


● コード ※例外処理は省略
int** my2dMalloc(int rows, int cols) {
int i;
int header = rows * sizeof(int*);
int data = rows * cols * sizeof(int);
int** rowptr = malloc(header + data);

int* buf = (int*) (rowptr + rows);
for(i = 0; i < rows; i++) {
rowptr[i] = buf + i * cols;
}
return rowptr;
}

void my2dFree(int ** rowptr) {
free(rowptr);
}