2009-10-18 5 views
3

Я относительно новичок в C++, и у меня проблемы с пониманием структуры.Некоторые вопросы о структуре и массиве C++

У меня есть структура объявлен как следовать

struct MyNode { 
    int level; 
    int index; 
    MyNode children[4]; 
} 

Однако код не компилировать и сообщает об ошибке C2148: общий размер массива не должен превышать 0x7fffffff байт.

Но следующий код компилируется

struct MyNode { 
    int level; 
    int index; 
    MyNode* children; 
} 

Могу ли я код MyNode, как и в первом примере, или есть что-то, что мне не хватает.

Спасибо!

+0

Какой компилятор? Как заметил кто-то другой, это может дать вам лучшую диагностику в этом случае. –

ответ

5

Это не удается скомпилировать, поскольку компилятор должен знать размер каждого типа. Итак, что такое sizeof(MyNode)? Это sizeof(int) * 2 + sizeof(MyNode): Рекурсия делает размер невозможным для определения.

Вам нужен указатель, как в вашем втором примере. Почему это работает? Потому что sizeof(MyNode*) известен: это размер адреса на целевой платформе.

+0

Спасибо TheSamFrom1984! Наконец-то я понял, что происходит с вашим примером и заработал мой код. : D – gsf

+0

у вас есть глупый компилятор. GNU C/++ дает ясные ошибки. – Test

0

Вы не можете построить структуру, которая использует свой собственный тип как тип одного из своих полей, потому что во время выполнения компилятор не знает, какой размер будет представлять собой общая структура. Как вы пишете структуру именно так, как она будет выглядеть в памяти, то есть 4 байта для уровня, 4 байта для индекса и? байтов для MyNode. См. Проблему?

Теперь во втором примере вы знаете тип MyNode :: children, это указатель, поэтому его размер равен 4 (в 32-битной системе Windows), поэтому общий размер структуры известен: 4+ 4 + 4 = 12.

1

Проблема с первым примером заключается в том, что у вас есть рекурсивное расширение вашей структуры. Каждый дочерний MyNode содержит четыре MyNodes, которые, в свою очередь, содержат еще четыре MyNodes, которые в свою очередь ... Вы получаете изображение.

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

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