C 3d数组动态内存分配,问题,需要帮助

时间:2010-02-03 16:00:10

标签: c memory 3d matrix allocation

我正在通过网络寻找一种动态分配3d矩阵空间的方法,比如int类型。 我找到了许多关于2d矩阵的网站,这个 http://www.taranets.com/cgi/ts/1.37/ts.ws.pl?w=329;b=286 这个例子如下图所示。 我理解了以上所有的例子,但这涉及3d我不能。创作者是以向后的方式分配空间还是其他什么? 他开始为整个矩阵分配空间,然后进入Z轴?那是我无法理解的。

此外,如果您知道有关此的任何好网站,请在此处发布,我们将不胜感激。

    /* Program 9.4 from PTRTUT10.HTM   6/13/97 */
// http://www.taranets.com/cgi/ts/1.37/ts.ws.pl?w=329;b=286

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

int X_DIM=16;
int Y_DIM=5;
int Z_DIM=3;

int main(void)
{
    char *space;
    char ***Arr3D;
    int y, z;
    ptrdiff_t diff;

    /* first we set aside space for the array itself */

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

    /* next we allocate space of an array of pointers, each
       to eventually point to the first element of a
       2 dimensional array of pointers to pointers */

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

    /* and for each of these we assign a pointer to a newly
       allocated array of pointers to a row */

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

        /* and for each space in this array we put a pointer to
           the first element of each row in the array space
           originally allocated */

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

    /* And, now we check each address in our 3D array to see if
       the indexing of the Arr3d pointer leads through in a
       continuous manner */

    for (z = 0; z < Z_DIM; z++)
    {
        printf("Location of array %d is %p\n", z, *Arr3D[z]);
        for ( y = 0; y < Y_DIM; y++)
        {
            printf("  Array %d and Row %d starts at %p\n", z, y, Arr3D[z][y]);
            diff = Arr3D[z][y] - space;
            printf("    diff = %d  ",diff);
            printf(" z = %d  y = %d", z, y);
        }
        putchar('\n');
    }
    putchar('\n');
    system("PAUSE");
    return 0;
}

2 个答案:

答案 0 :(得分:4)

空间确实是为整个矩阵分配的内存。

然而,他继续使用

创建指向空间区域的指针
Arr3D = malloc(Z_DIM * sizeof(char **));

Arr3D的目的只是通过索引(指定Z,Y,X索引)访问空间的一种方式。空间只有一个索引,因此如果您想通过空格访问矩阵元素[a][b][c],则需要将其转换为单个space[d],其中d类似于a*Y_DIM*Z_DIM + b*Z_DIM+c。因此,使用Arr3D,您可以通过[a][b][c]访问Arr3D[a][b][c]

Arr3D本身就是一个char**数组,它指向char类型的指针。 Arr3D[z]是指向char指针数组的指针。然后将每个Arr3D[z][y]设置为指向原始3x3矩阵中的特定行

Arr3D[z][y] = space + (z*(X_DIM * Y_DIM) + y*X_DIM);

然后使用Arr[1][2],您将访问带有z=1, y=2矩阵的行。

答案 1 :(得分:0)

该示例应该做的是将更高的维度指向已经分配的连续块。