我刚刚在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 );
我现在的问题是,这是三维数组类对象的有效实现,还是会遇到一些麻烦?注意,在实际情况下,尺寸大约是每个1000倍的大。
发布于 2022-01-26 09:19:59
如果您有一个数组,如
double a[Nx][Ny][Nz];
然后你可以写
double (*arr3d)[Ny][Nz] = a;
即指针arr3d
指向具有double{Nt][Nz]
类型的数组a
的第一个元素。
所以这个内存分配
double (*arr3d)[Ny][Nz] = calloc(Nx, sizeof *arr3d);
是对的。实际上,动态分配了一个三维数组,指针arr3d
指向数组的第一个元素。
https://stackoverflow.com/questions/70867455
复制相似问题