Инициализировать безымянный структурный указатель / массив - PullRequest
0 голосов
/ 14 января 2011
struct A
{
    int member1;
    int member2;
    struct B
    {
        int member3;
        int member4;
    } *b;
};

Как я могу инициализировать A и одновременно создать массив B для заполнения поля b? Мне нужна статическая переменная, поэтому желательно вызывать функцию.

Я попробовал это, но это не работает (я не думал, что будет):

static A a = {
    1,
    2,
    & { {3, 4}, {5, 6} },
}

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Я думаю, что проблема с этим кодом в этой строке:

& { {3, 4}, {5, 6} }

Проблема в том, что {{3, 4}, {5, 6}} является rvalue (значением, а не объектом), и вы не можете получить адрес rvalue. В конце концов, откуда взяться памяти для этого объекта? Тем не менее, вы можете избежать переписывания этого в

A::B elems[2] = {{3, 4}, {5, 6}};
static A a = {
    1,
    2,
    elems
};

Теперь у вас есть lvalue, на который вы можете указать.

1 голос
/ 14 января 2011

Вы пометили это как C, так и C ++;следующий ответ для C.

В C89 вы можете сделать:

static struct B a_b_init[] = { {3, 4}, {5, 6} };
static struct A a = {
    1,
    2,
    a_b_init
};

В C99 вы можете использовать составной литерал, синтаксис которого очень похож на вашу попытку:

static struct A a = {
    1,
    2,
    (struct B []){ {3, 4}, {5, 6} }
};
...