C 3d масив динамично разпределение на паметта, въпрос, нужда от помощ

Търсих в мрежата начин за динамично разпределяне на пространство за 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;
}

person Martin Berger    schedule 03.02.2010    source източник


Отговори (2)


пространството наистина е паметта, разпределена за цялата матрица.

Въпреки това, той продължава да създава указатели към областите, разположени в пространството с

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] е указател към масив от символни указатели. След това всяко Arr3D[z][y] се настройва да сочи към конкретен ред в оригиналната 3x3 матрица с

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

Така че с Arr[1][2] имате достъп до ред с z=1, y=2 от матрицата.

person Will    schedule 03.02.2010
comment
вярно Основната концепция тук е, че space сочи към действителния 3D масив, сплескан в 1D масив, а Arr3D се настройва като индекс в този масив - това просто прави достъпа до него по-удобен. - person caf; 04.02.2010
comment
Сега е малко по-ясно, разбирам как работи това, но все още имам проблеми с визуализирането на достъпа до обърнат 3d масив със ZYX. Този пример тук е по-подходящ за мен в момента: stackoverflow.com/questions/1824363/. Има повече смисъл за начинаещ като мен. Благодаря на Уил и други за помощта! - person Martin Berger; 04.02.2010

Това, което примерът трябва да направи, е да насочи по-високи измерения към вече разпределения съседен блок.

person Liz Albin    schedule 03.02.2010