如何在C中动态分配连续的3D数组?

时间:2010-03-09 19:46:05

标签: c arrays 3d malloc

在C中,我想按此顺序遍历数组

 for(int z = 0; z < NZ; z++)
    for(int x = 0; x < NX; x++)
       for(int y = 0; y < NY; y++)
           3Darray[x][y][z] = 100;

如何以3Darray [0] [1] [0]在内存中3Darray [0] [2] [0]之前出现的方式创建此数组?

我可以进行初始化工作,给我“z-major”排序,但我真的想要这个3d数组的y主要排序

这是我一直试图使用的代码:

char *space;
char ***Arr3D;
int y, z;
ptrdiff_t diff;



space = malloc(X_DIM * Y_DIM * Z_DIM * sizeof(char))

Arr3D = malloc(Z_DIM * sizeof(char **));

for (z = 0; z < Z_DIM; z++)
{
    Arr3D[z] = malloc(Y_DIM * sizeof(char *));

    for (y = 0; y < Y_DIM; y++)
    {
        Arr3D[z][y] = space + (z*(X_DIM * Y_DIM) + y*X_DIM);
    }
}

4 个答案:

答案 0 :(得分:5)

您无法更改语言中隐含的数组排序。数组排序在C中是标准的。

如果您想更改排序方式,只需更改数组访问方式,即:[x][z][y]而不是[x][y][z]

答案 1 :(得分:1)

我认为唯一的方法是在连续的数据存储上编写自己的wind / unwind功能。换句话说,您将不得不编写自己的地图来计算值的存储位置。

如果您试图使某个数组的顺序遍历更有效,您可以随时将输入矩阵转换为,然后将其放入数组中,然后在获得它时再次进行转换出。 C风格的多维数组是打包顺序,所以数学可能会有点棘手(并且超出了我在这里可以详细说明的时间)。

很抱歉没有更好的答案,但我希望有帮助

答案 2 :(得分:1)

使用指针数组可以加快速度,但代价是更复杂。如果您不确定是否需要性能,那么您可以尝试使用C宏:

#define ARR3D(x,y,z) space[(x) + XDIM*((y) + Y_DIM*(z))]

这假设x,y和z分别是最里面,中间和最外面的维度。

答案 3 :(得分:0)

伪代码:

malloc a chunk of memory big enough for
   the char *** pointer for z,
   the char ** pointers for y, which will get pointed to by zs
   the char * pointers for x, which will get pointed to by ys
   the big block of data that they will, in the end, be pointed to by xs
assign z's, y's, x's so that 
    contiguous blocks from the big block of data are adjacent in the y dimension
    (instead of adjacent in the x dimension, as would be normal)

我已经完成了2D数组的单一malloc技巧,仅仅因为心理练习和单个malloc /单个免费的额外便利性,并且它工作得很漂亮(只需确保获得一个良好对齐的内存块) 。我从未想过用它来破坏内存邻接。