0

我一直试图弄清楚如何初始化指向 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”变量分配给一块内存,但完全失败了。

4

1 回答 1

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]
于 2012-01-10T06:42:58.330 回答