Указатели и массивы не являются взаимозаменяемыми, как вы, кажется, хотите, чтобы они были. Я думаю, что вы, вероятно, делаете что-то намного проще. Сделать 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]