出于某种原因,我认为我的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月以来一直没有处理这部分代码。
答案 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
个元素,i
倍y×z
的大小 - 平面加j
次z
- 元素行的长度,以便rates[i][j]
指向行j
的第一个元素飞机i
。
如果C99可用,或y
和z
是编译时常量,那么通过分配
double (*rates)[y][z] = malloc(x * sizeof *rates);
在寻址时间接较少。