Инициализация структурного массива внутри структурного массива - PullRequest
0 голосов
/ 23 марта 2012

У меня есть вопрос при инициализации моего структурного массива внутри структурного массива.например, если у меня есть код, показанный ниже:

#include <stdio.h>

int main() {

typedef struct {
    int a;
    int b;
    int c;
} FIRST_T;

typedef struct {
    int x;
    int y;
    int z;
    FIRST_T *p;
} SECOND_T;

FIRST_T p1[]={{1,2,3},{3,4,5},{6,7,8}};
FIRST_T p2[]={{4,5,6},{7,8,9}};

SECOND_T my_second[]=
{
{1,2,3,p1},
{4,5,6,p2}
};

}

если мне нужно инициализировать мой первый массив в самой части инициализации второго массива, то как мне написать свою typedef SECOND_T?как

SECOND_T my_second[]=
{
{1,2,3,{{1,2,3},{4,5,6},{7,8,9}}},
{4,5,6,{{1,1,1},{2,2,2}}}
};

тогда каким должен быть мой SECOND_T?

Я уверен, что не могу определить это как:

typedef struct {
    int x;
    int y;
    int z;
    FIRST_T p[]; //(I know its a blunder)
} SECOND_T;

Пожалуйста, помогите.

Ответы [ 4 ]

1 голос
/ 23 марта 2012

Вы не можете определить тип с неограниченным массивом в C, вы должны указать размерность.Таким образом, вы либо делаете:

typedef strut {
    int x;
    int y;
    int z;
    FIRST_T f[SOME_VALUE];
} SECOND_T;

, а затем инициализируете SOME_VALUE количество членов всегда , либо делаете это так, как вы.

1 голос
/ 23 марта 2012

Я не думаю, что вы можете сделать это, то есть инициализировать FIRST_T внутри инициализации SECOND_T, кроме первого способа, которым вы это делаете. Подумайте об этом, как компилятор может сказать, сколько FIRST_T есть в SECOND_T? Проблема в том, что вы можете НЕ определять массив гибкого размера struct static .

0 голосов
/ 23 марта 2012

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

SECOND_T my_second[] = {
  {1,2,3, &(FIRST_T){{1,2,3},{3,4,5},{6,7,8}}},
  {4,5,6, &(FIRST_T){{4,5,6},{7,8,9}}}
};

У вас будет компилятор, который соответствует C99 длячто.

0 голосов
/ 23 марта 2012

вы не можете так делать:

SECOND_T my_second[]=
{
{1,2,3,{{1,2,3},{4,5,6},{7,8,9}}},
{4,5,6,{{1,1,1},{2,2,2}}}
};

с

typedef struct {
int x;
int y;
int z;
FIRST_T p[]; //(I know its a blunder)

} SECOND_T;

, поскольку компилятор не знает, как распределить память для этой структуры. если вы должны сделать это, вы должны определить

typedef struct { int x,y,z; FIRST_T p[CONST_VALUE];}SECOND_T;

но я советую вам использовать первый стиль, который вы пишете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...