トリプルポインタを関数の引数に渡して、2次元配列のメモリ確保をする
関数内で2次元配列のメモリ確保をして、関数の引数に返すためには、その引数にはトリプルポインタを渡してあげる必要があります。
c言語でここまで操作できると上級者と言えるのではないでしょうか。
int型の2次元配列のためのメモリ確保を行って、関数の引数に返してあげます。
まずは、関数の引数にint型のトリプルポインタを設定します。
void mallocArray(int*** arr){ 〜省略〜
そして、ROW行分のポインタを確保します。
*arr = (int**)malloc(sizeof(int*) * ROW);
更に、ROW行分だけ、COL列サイズ分のメモリを確保します。
for(i = 0; i < ROW; i++){ (*arr)[i] = (int*)malloc(sizeof(int) * COL); if((*arr)[i] == NULL){ return; } }
更に理解を深めるために、realloc()もしてみます。
for(i = 0; i < ROW; i++){ (*arr)[i] = (int*)realloc((*arr)[i] , sizeof(int) * (COL + 1)); if((*arr)[i] == NULL){ return; } }
2次元配列へのアクセスは下記のようにします。
それぞれの要素に値を代入しています。
for(i = 0; i < ROW; i++){ for(j = 0; j < COL + 1; j++){ (*arr)[i][j] = i * j; } }
サンプルコード
下記がサンプルコードになります。
関数実行後に、2次元配列の要素をprintf出力しています。
$ cat sample.c #include <stdio.h> #include <stdlib.h> #define ROW 6 #define COL 5 void mallocArray(int*** arr){ int i, j; *arr = (int**)malloc(sizeof(int*) * ROW); if(arr == NULL){ return; } for(i = 0; i < ROW; i++){ (*arr)[i] = (int*)malloc(sizeof(int) * COL); if((*arr)[i] == NULL){ return; } } for(i = 0; i < ROW; i++){ (*arr)[i] = (int*)realloc((*arr)[i] , sizeof(int) * (COL + 1)); if((*arr)[i] == NULL){ return; } } for(i = 0; i < ROW; i++){ for(j = 0; j < COL + 1; j++){ (*arr)[i][j] = i * j; } } } int main(){ int** arr = NULL; int i, j; mallocArray(&arr); for(i = 0; i < ROW; i++){ for(j = 0; j < COL + 1; j++){ printf("%d ", arr[i][j]) ; } printf("\n"); } return 0; }
下記が実行結果になります。
$ gcc -o sample sample.c $ ./sample 0 0 0 0 0 0 0 1 2 3 4 5 0 2 4 6 8 10 0 3 6 9 12 15 0 4 8 12 16 20 0 5 10 15 20 25