首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将3D数组实现为指向可变长度数组的指针

将3D数组实现为指向可变长度数组的指针
EN

Stack Overflow用户
提问于 2022-01-26 17:08:34
回答 1查看 94关注 0票数 2

我刚刚在C中了解了可变长度数组,有人建议我可以在C中实现一个类似3D数组的对象,只需作为指向可变长度数组的指针。一个简单的实现如下:

代码语言:javascript
运行
复制
#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可以简单地传递给一个函数,

代码语言:javascript
运行
复制
int doSomething( size_t dim1, size_t dim2, size_t dim3, double arr3d[dim1][dim2][dim3] );

通过在main函数中调用此函数,如下所示:

代码语言:javascript
运行
复制
doSomething( Nx, Ny, Nz, arr3d );

我现在的问题是,这是三维数组类对象的有效实现,还是会遇到一些麻烦?注意,在实际情况下,尺寸大约是每个1000倍的大。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-26 17:19:59

如果您有一个数组,如

代码语言:javascript
运行
复制
double a[Nx][Ny][Nz];

然后你可以写

代码语言:javascript
运行
复制
double (*arr3d)[Ny][Nz]  = a;

即指针arr3d指向具有double{Nt][Nz]类型的数组a的第一个元素。

所以这个内存分配

代码语言:javascript
运行
复制
double (*arr3d)[Ny][Nz] = calloc(Nx, sizeof *arr3d);

是对的。实际上,动态分配了一个三维数组,指针arr3d指向数组的第一个元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70867455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档