2011-01-14 2 views
0
struct A 
{ 
    int member1; 
    int member2; 
    struct B 
    { 
     int member3; 
     int member4; 
    } *b; 
}; 

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

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

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

Вы хотите это на C++ или C? Теги '[C++]' и '[c]' ** не являются синонимами **; ответы будут варьироваться в зависимости от языка. –

+2

Определить «не работает». –

+0

И я согласен с @Insilico. Выберите язык, как в тегах вопроса, так и на используемом вами языке. Это * разные языки *. –

ответ

1

Вы отметили это как с 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} } 
}; 
+0

Это именно то, что я искал. Спасибо! И что было бы эквивалентом в C++? Мне все еще нужна структура с нестационарным контуром, а не контейнер STL. –

+0

Я заметил, что этот синтаксис компилируется с GCC для C, но не для C++. Ошибка - это скобки вокруг скалярного инициализатора для «B *». –

+1

@MTsoul: Первый вариант должен работать и для C++, и эквивалентен по сути второму (это просто, что статический массив структуры получает имя, а не анонимно). – caf

3

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

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

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

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

Поскольку теперь у вас есть именующее выражение можно указать в.

+0

Это то, что я думал, может работать. Я ожидал, что это сработает, потому что это делает: 'const char * ptr =" blah "'. –

Смежные вопросы