c中动态结构数组内的动态数组

时间:2012-01-10 06:33:56

标签: data-structures multidimensional-array initialization calloc

我试图弄清楚如何在2d结构数组中初始化指向3d数组的指针。当我能够声明这样的结构时,我工作得很好:

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

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

但不幸的是,这个结构太大,无法宣布为全球性的。所以我必须调用内存(系统上可用的192GB内存: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 :(得分:0)

指针和数组不能以您希望它们的方式互换。我想你可能会做一些更简单的事情。将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]