構造体の動的な確保2

2006/1/31更新

プログラム例 1

int malloc_ptcl(particle **p, int dim, int num_p); /* プロトタイプ表現 */ main(){ Particle *p; int num_p; int dim; int i; printf("Enter the dimension of X :"); scanf("%d",&dim); printf("Enter the number of particles :"); scanf("%d",&num_p); malloc_ptcl(&p, dim, num_p); }
と用いることで、Particle の領域を確保してくれる関数を作成しましょう。 関数に渡すときは、&p とポインタ変数のアドレスを渡していて、関数側では、 ポインタのポインタとして受け取っていることに注意してください。
こうしないと、「そのポインタ変数 p 自身に格納される構造体の配列のはじめ のアドレスの入力」を、関数内で実行出来ないことに注意してください。 普通の変数をアドレス渡ししないと、その中の変数を関数内で変更できないことと 同義の話です。
void malloc_ptcl(Particle **p, int dim, int num_p){ int i; if( NULL == (*p =(Particle*)malloc(num_p*sizeof(Particle)))) exit(1); // ここでパーティクルを num_p 個確保している  // エラー処理もしていることに注意 for(i=0; i<num_p; i++){ (*p+i)->no = i;  // 構造体の指定の仕方に注意 if(NULL == ((*p+i)->x =(double *)malloc(dim*sizeof(double)))) exit(1); (*p+i)->nb_p[0] = (*p+(i-1+num_p)%num_p); (*p+i)->nb_p[1] = (*p+(i+1)%num_p); } }
また、さらに、返り値としてポインタのポインタ変数を返す関数として作成すると 以下のようになります。

プログラム例2

Particle *malloc_ptcl(particle **p, int dim, int num_p); main(){ Particle *p; int num_p; int dim; int i; printf("Enter the dimension of X :"); scanf("%d",&dim); printf("Enter the number of particles :"); scanf("%d",&num_p); p = malloc_ptcl(dim, num_p); } Particle *malloc_ptcl(int dim, int num_p){ Particle *q; int i; if( NULL == (q =(Particle*)malloc(num_p*sizeof(Particle)))) exit(1); for(i=0; i<num_p; i++){ q[i].no = i;  if(NULL == ((q+i)->x =(double *)malloc(dim*sizeof(double))))  // 上記2行での構造体の2通りの指定の仕方(同じ意味です)に注意 exit(1); }  return q; }