C 我做了什么?指针指向指针指向双精度指针?

C 我做了什么?指针指向指针指向双精度指针?,c,arrays,pointers,C,Arrays,Pointers,出于某种原因,我认为我有allRates是x*y*z长度的指向双精度的指针,rates本质上是一个三维数组。但我记不起这是怎么回事了 // 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); fo

出于某种原因,我认为我有allRates是x*y*z长度的指向双精度的指针,rates本质上是一个三维数组。但我记不起这是怎么回事了

// 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);
  }
 }
//分配3D速率数组
double*allRates=malloc(x*y*z*sizeof(double));
如果(!allRates)退出(1);
双倍***费率=malloc(x*sizeof(双倍**));
如果(!rates)退出(1);
对于(i=0;i
分配一个足够大的内存块,以容纳
x*y*z
类型的
double
值(如果尺寸足够小;如果乘积的数学结果不能表示为
size\u t
,则分配模
size\u MAX+1
)的剩余部分

分配足够大的内存块,以容纳
x
类型的
double**
值(同样,如果
x
足够小)。这些值用作第一维度的索引

 for(i=0; i<x; i++) {
  rates[i] = malloc(y * sizeof(double *));
// Check rates[i] allocation?
每个
double*
s
rates[i][j]
都指向分配给
allRates
的块,偏移量为
i*(y*z)+j*z
元素,
i
乘以
y×z
平面的大小加上
j
乘以
z
元素行的长度,以便
rates[i][j]
指向平面
i
中行
j
的第一个元素

如果C99可用,或者
y
z
是编译时常量,那么通过分配

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

在寻址时减少间接寻址。

你应该注释代码的一个很好的理由是——这不仅仅是为了其他人的利益……通常在这种情况下,最好问问自己代码背后的想法是什么。然后代码,尽管很凌乱,却更有意义。因为你知道这个想法,你有最好的机会解决这个问题关于文档的实用性,让浪费在解决这个问题上的时间再次成为你的一课。你知道我对代码的所有数学部分都做了注释……我只是(对我)忘记了这些晦涩难懂的东西数据结构。谢谢。我真的不确定这些对象的结构是什么。实际上,x和y都是运行时选项。z是程序前面确定的变量。
 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);
  }
 }
double (*rates)[y][z] = malloc(x * sizeof *rates);