-2

何らかの理由で、私はallRatesがdoubleへのx * y * z長さポインターであり、ratesは本質的に3次元配列であると思います。しかし、これがどのように機能するかを正確に思い出せません。

// Allocate 3D Rate Array  
 double *allRates = malloc( x*y*z*sizeof(double) );
  if (!allRates) exit(1);
 double ***rates = malloc( x*sizeof(double **) );
  if (!rates) exit(1);

 for(i=0; i<x; i++) {
  rates[i] = malloc(y * sizeof(double *));
// Check rates[i] allocation?
  for(j=0; j<y; j++) {
   rates[i][j] = allRates + (i*y*z) + (j*z);
  }
 }

それは正しく実行されます...私はドキュメントに取り組んでいるだけで、3月以来コードのこの部分に取り組んでいません。

4

1 に答える 1

3
// Allocate 3D Rate Array  
 double *allRates = malloc( x*y*z*sizeof(double) );
  if (!allRates) exit(1);

x*y*zタイプの値を保持するのに十分な大きさのメモリブロックを割り当てますdouble(次元が十分に小さい場合。積の数学的な結果がとして表現できない場合はsize_t、そのモジュロの余りを割り当てSIZE_MAX + 1ます)。

 double ***rates = malloc( x*sizeof(double **) );
  if (!rates) exit(1);

xタイプの値を保持するのに十分な大きさのメモリブロックを割り当てますdouble**(ここでも、x十分に小さい場合)。これらは、最初の次元のインデックスとして使用されます。

 for(i=0; i<x; i++) {
  rates[i] = malloc(y * sizeof(double *));
// Check rates[i] allocation?

割り当てを確認することをお勧めします。何も失敗しない場合、それぞれがへのポインタをrates[i]保持するのに十分な大きさのメモリブロックを指すようになります。ydouble

  for(j=0; j<y; j++) {
   rates[i][j] = allRates + (i*y*z) + (j*z);
  }
 }

double*sは、要素のオフセットで、-planeのサイズに-element行の長さを掛けたものrates[i][j]に割り当てられたブロックを指すように作成され、平面内の行の最初の要素を指します。allRatesi*(y*z) + j*ziy×zjzrates[i][j]ji

C99が使用可能な場合、またはコンパイル時定数yzある場合は、次のように割り当てることで簡単に実現できます。

double (*rates)[y][z] = malloc(x * sizeof *rates);

アドレス指定時の間接化が少なくなります。

于 2012-11-14T12:13:59.930 に答える