我做了什么?指针指向双指针?

时间:2012-11-14 11:09:22

标签: c arrays pointers

出于某种原因,我认为我的allRates是x * y * z长度指针,双精度和速率本质上是一个三维数组。但我不记得究竟是如何运作的。

// 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月以来一直没有处理这部分代码。

1 个答案:

答案 0 :(得分: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]都会指向一个足够大的内存块,以便y指向double

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

double* s rates[i][j]中的每一个都指向分配给allRates的块,偏移量为i*(y*z) + j*z个元素,iy×z的大小 - 平面加jz - 元素行的长度,以便rates[i][j]指向行j的第一个元素飞机i

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

可以更简单地实现
double (*rates)[y][z] = malloc(x * sizeof *rates);

在寻址时间接较少。