将 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 指向数组的第一个元素。