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);
}