-2

出于某种原因,我认为我有 allRates 是 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);
  }
 }

它运行正常......我只是在处理文档,自三月份以来一直没有处理这部分代码。

4

1 回答 1

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

分配一个足够大的内存块来保存x*y*ztypedouble的值(如果维度足够小;如果乘积的数学结果不能表示为 a 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]都指向一个足够大的内存块来保存y指向double.

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

每个double*srates[i][j]都指向分配给 的块,在元素allRates的偏移处,乘以 -plane 的大小加上乘以-element 行的长度,因此指向plane中 row 的第一个元素。i*(y*z) + j*ziy×zjzrates[i][j]ji

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

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

寻址时使用较少的间接寻址。

于 2012-11-14T12:13:59.930 回答