Самостоятельная ссылка в C Structs - PullRequest
9 голосов
/ 16 августа 2011

Эта часть K & R (книга C) заставила меня задуматься:

Из книги:

struct tnode {
             char *word;
             int    count;
             struct tnode *left;
             struct tnode *right;
};

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

Поскольку определение tnode не использует tnode, а просто как указатель на tnode, компилятор дает нам свободный проход.Но мне интересно, откуда компьютер знает, сколько памяти дать tnode, когда он объявлен?

Ответы [ 2 ]

14 голосов
/ 16 августа 2011

Указатели имеют фиксированный размер (32/64 бит в зависимости от платформы), поэтому компилятор знает, сколько памяти требуется для левого и правого указателей, и может рассчитать весь размер структуры.

По той же причине, если вам нужен указатель, достаточно сделать предварительное объявление struct tnode;, и вы можете использовать указатель для этой структуры, например: struct tree { struct tnode* root; };

0 голосов
/ 16 августа 2011

Простой, у вас есть 4 члена в struct каждый с известным количеством требований к памяти.

Хотя left и right являются указателями типа tnode, выделения памяти для их членовне требуется, пока экземпляр tnode не создан с использованием malloc() и адрес назначенного им экземпляра.

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