ポインタ配列の動的確保
ポインタの配列の動的確保について教えてください。
入力した数値をポインタ配列に入れるプログラムです。
下記のように書いてみました。(見づらくてごめんなさい)
#include<stdio.h>
#include<stdlib.h>
#define kensu 3
main()
{
char abc[kensu+1]={'A','B','C','\0'};
char *ptr[kensu];
int i;
printf("3つの整数を入力して下さい。\n");
for(i=0;i<kensu;i++){
ptr[i]=(char*)malloc(sizeof(char)*10);
if(ptr[i]==NULL){
printf("メモリの取得に失敗しました");
exit(1);
}
printf("整数%c:",abc[i]);
fgets(ptr[i],10,stdin);
if(ptr[i][strlen(ptr[i])-1]=='\n')
ptr[i][strlen(ptr[i])-1]='\0';
}
for(i=0;i<kensu;i++)
free(ptr[i]);
}
ちゃんと動いているようです。
しかし、ポインタ配列の動的確保をネットで調べてみると、ポインタのポインタ(?)を使って、下記のように2度mallocしています。
#include <stdio.h>
#include <stdlib.h>
#define N 3
int main(void)
{
char** arr;
int i,j;
arr = (char**)malloc(N * sizeof(char*)); /* ポインタ配列を確保 */
/* 配列の要素それぞれにつき、メモリ領域を確保 */
for(i=0;i<N;i++) arr[i] = (char*)malloc(N * sizeof(char));
・・・
ポインタの配列を宣言して、配列の各要素に動的確保するのと
ポインタのポインタを宣言し、ポインタ配列を動的確保して、再度配列の要素に動的確保するのとでは、何か違いがあるのでしょうか?
ポインタのポインタを宣言し、ポインタ配列を確保する必要性が良く分かっていないのです。
ネット等で調べて見たのですが、理解力がないのかよく分かりませんでした。
どうか教えてください。
お礼
ultraOSさん すいません、間違えましたというか補足です。プログラム中の3とか10という数字は実際にはsize1、size2という変数で実行時にわかるものです。以下のコードが正しいです。 Hoge ***array[3]; /*Hogeは自分で定義した構造体 3は静的にわかる*/ array[0] = (Hoge ***)malloc(sizeof(Hoge **) * size1); for(i = 0; i < size1; i++) { array[0][i] = (Hoge **)malloc(sizeof(Hoge *) * size2); for(j = 0; j < size2; j++) { array[0][i][j] = (Hoge *)malloc(sizeof(Hoge)); } } です。array[1]とarray[2]についても同様にしています。よろしくおねがいします。
補足
ultraOSさん ありがとうございます。 mallocは下のように行っています。 Hoge ***array; /*Hogeは自分で定義した構造体*/ array = (Hoge ***)malloc(sizeof(Hoge **)* 3); for(i = 0; i < 3; i++) { array[i] = (Hoge **)malloc(sizeof(Hoge *) * 10); for(j = 0; j < 10; j++) { array[i][j] = (Hoge *)malloc(sizeof(Hoge)); /*ここは実際には関数呼び出しを用いています*/ } } malloc時のNULLチェックなどは省略して書きました。以上のように書いているのですが、問題あるでしょうか?とりあえず、確保サイズを単純に大きくして試してみたいと思います。