Динамический массив внутри массива динамической структуры в c - PullRequest
0 голосов
/ 10 января 2012

Я застрял, пытаясь выяснить, как инициализировать указатель на трехмерный массив внутри массива двумерной структуры. У меня все работало нормально, когда я мог объявить структуру следующим образом:

    #define ROUSSEAU      300
    #define OSSO          500
    #define MOJO          9000

typedef struct x_primitive
{  
    short avg[ROUSSEAU][OSSO][MOJO];
} xprimitive;

Но, к сожалению, структура слишком велика, чтобы объявить ее глобальной. Поэтому я должен вычислить память (192 ГБ памяти доступно в системе: win 7 64 бит);

typedef struct x_primitive
{  
    short ***avg;
} xprimitive;

xprimitive **xPmtv, *_xPmtv;


void xallocatePmtvMemory(void)
{
    int structureCount = 10;

    unsigned __int64 pmtvStructureSize =  ROUSSEAU * OSSO * MOJO * sizeof(short);
    unsigned __int64 memoryBlockSize   =   structureCount * pmtvStructureSize;

    _xPmtv = (xprimitive *)  calloc(structureCount, pmtvStructureSize);
    xPmtv  = (xprimitive **) calloc(structureCount, sizeof(xprimitive *));
    for ( int i = 0; i < structureCount; ++i)
    {
        unsigned __int64 index = i * pmtvStructureSize;
        xPmtv[i] = &_xPmtv[ index ];

            // **************** here is the problem  ******
        xPmtv[i]->avg[ROUSSEAU][OSSO][MOJO] =  &_xPmtv[ index + (ROUSSEAU + OSSO + MOJO) ];

    }
}

Я пытаюсь присвоить переменную "avg" куску памяти, но потерпел неудачу.

1 Ответ

0 голосов
/ 10 января 2012

Указатели и массивы не являются взаимозаменяемыми, как вы, кажется, хотите, чтобы они были. Я думаю, что вы, вероятно, делаете что-то намного проще. Сделать avg указателем:

typedef struct x_primitive
{  
    short (*avg)[ROUSSEAU][OSSO][MOJO];
} xprimitive;

А затем выделить пространство для массива во время выполнения:

xprimitive xPmtv;

xPmtv.avg = calloc(1, ROUSSEAU * OSSO * MOJO * sizeof(short));

Использовать его немного забавно, хотя:

(*xPmtv.avg)[1][2][3]

Если у вас несколько структур, просто бросьте инициализацию в цикл. Возможно, лучшая идея - использовать элемент гибкого массива, чтобы синтаксис использования выглядел немного более нормальным - это будет стоить вам фиктивной записи в структуре - членам гибкого массива не разрешено играть самостоятельно. Опять же, почему у вас в любом случае есть структура только с одним полем?

typedef struct x_primitive
{
    int   dummyEntry;
    short avg[][OSSO][MOJO];
} xprimitive;

Чтобы выделить его, вы должны использовать:

xprimitive *xPmtv = calloc(1, sizeof(xprimitive) + ROUSSEAU * OSSO * MOJO * sizeof(short));

И получить доступ к массиву что-то вроде:

xPmtv->avg[1][2][3]
...