将 3D 数组实现为指向可变长度数组的指针
Implementing a 3D array as a pointer to a variable length array
我刚刚了解了 C 中的 可变长度数组 ,有人向我建议我可以在 C 中实现类似 3D 数组的对象,只需将其作为指向可变长度的指针大批。一个简单的实现如下所示:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] ) {
size_t ii, jj, kk,
Nx, Ny, Nz;
Nx = 2;
Ny = 3;
Nz = 4;
// initialize 3D array as pointer to a variable length array
double (*arr3d)[Ny][Nz] = calloc(Nx, sizeof *arr3d);
for( ii=0 ; ii<Nx ; ++ii )
for( jj=0 ; jj<Ny ; ++jj )
for( kk=0 ; kk<Nz ; ++kk )
printf( "arr3d[%ld,%ld,%ld] = %f, address = %p\n",
ii, jj, kk, arr3d[ii][jj][kk], &arr3d[ii][jj][kk] );
free(arr3d);
return 0;
}
据我了解,一个优点(除了单行实现之外)是 arr3d
可以简单地传递给一个函数,
int doSomething( size_t dim1, size_t dim2, size_t dim3, double arr3d[dim1][dim2][dim3] );
通过在main
函数中调用该函数如下:
doSomething( Nx, Ny, Nz, arr3d );
我现在的问题是,这是 3D 类数组对象的有效实现,还是我 运行 会遇到麻烦?请注意,在实际情况下,尺寸大约每个尺寸大 1000 倍。
如果你有一个像
这样的数组
double a[Nx][Ny][Nz];
那你可以写
double (*arr3d)[Ny][Nz] = a;
即指针 arr3d
指向数组 a
中具有 double{Nt][Nz]
.
类型的第一个元素
所以这个内存分配
double (*arr3d)[Ny][Nz] = calloc(Nx, sizeof *arr3d);
是正确的。实际上动态分配了一个 thre-dimensional 数组,指针 arr3d
指向数组的第一个元素。
我刚刚了解了 C 中的 可变长度数组 ,有人向我建议我可以在 C 中实现类似 3D 数组的对象,只需将其作为指向可变长度的指针大批。一个简单的实现如下所示:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] ) {
size_t ii, jj, kk,
Nx, Ny, Nz;
Nx = 2;
Ny = 3;
Nz = 4;
// initialize 3D array as pointer to a variable length array
double (*arr3d)[Ny][Nz] = calloc(Nx, sizeof *arr3d);
for( ii=0 ; ii<Nx ; ++ii )
for( jj=0 ; jj<Ny ; ++jj )
for( kk=0 ; kk<Nz ; ++kk )
printf( "arr3d[%ld,%ld,%ld] = %f, address = %p\n",
ii, jj, kk, arr3d[ii][jj][kk], &arr3d[ii][jj][kk] );
free(arr3d);
return 0;
}
据我了解,一个优点(除了单行实现之外)是 arr3d
可以简单地传递给一个函数,
int doSomething( size_t dim1, size_t dim2, size_t dim3, double arr3d[dim1][dim2][dim3] );
通过在main
函数中调用该函数如下:
doSomething( Nx, Ny, Nz, arr3d );
我现在的问题是,这是 3D 类数组对象的有效实现,还是我 运行 会遇到麻烦?请注意,在实际情况下,尺寸大约每个尺寸大 1000 倍。
如果你有一个像
这样的数组double a[Nx][Ny][Nz];
那你可以写
double (*arr3d)[Ny][Nz] = a;
即指针 arr3d
指向数组 a
中具有 double{Nt][Nz]
.
所以这个内存分配
double (*arr3d)[Ny][Nz] = calloc(Nx, sizeof *arr3d);
是正确的。实际上动态分配了一个 thre-dimensional 数组,指针 arr3d
指向数组的第一个元素。