Ваш код выделит достаточно памяти для хранения двух указателей и одного целого числа.Он не будет выделять память для двух указателей, на которые нужно указывать.
Тогда почему мне удалось написать example_node-> left = NULL;сразу вместо того, чтобы выделять память для левого?
Это изменит указатель, записав NULL
в память, выделенную указателю, точно так же, как example_node->whatever = 0
записал бы 0
впамять, выделенная для целого числа.Он ничего не делает с какой-либо памятью вне самой структуры узла.Однако, если бы вы сказали example_node->left->foo = NULL
, вы бы поступили плохо (тм).
РЕДАКТИРОВАТЬ : Я думаю, что у вас все еще есть проблемы с памятью указателя ипамять под указателем.Давайте попробуем аналогию.Представьте, что вы живете в многоквартирном доме, где вы можете арендовать складские помещения в подвале.Представьте также, что каждая квартира поставляется с мебелью, частью которой является стойка для ключей рядом со входом.Стеллаж для ключей имеет крючок с надписью «Ключ для хранения».
Если вы арендовали помещение для хранения, вы можете положить его ключ на соответствующий крючок для стойки.Если у вас нет складского помещения, то крючок пуст.Независимо от того, есть ли у вас помещение для хранения, вы выделили пространство для помещения для хранения ключ (крюк для стойки), которое отделено от самого помещения для хранения.Крючок для ключей существует независимо от места для хранения.
Попытка открыть помещение для хранения без ключа является незаконной.
Попытка открыть помещение для незнакомца с помощью ключа, который вы случайно обнаружили, обнаружив зданиегараж запрещен.
Вы можете открыть только комнату, которую владеете .
node
ваша квартира: если вы выделили node
(еслиу вас есть квартира) у вас есть место для указателя left
(у вас есть крючок с ключом для хранения).node->left
имеет выделенную для него память как часть node
выделения (вы получаете хук ключа хранилища независимо от того, арендуете ли вы хранилище или нет).
Вы можете назначить NULL
на left
(ничего не ставить нахук), или вы можете назначить значение указателя (поместив ключ на хук).
Если left
равно NULL
, вы не можете сделать example_node->left->foo = ...
, потому чтонулевой указатель явно говорит, что он не указывает ни на какую выделенную память (не может открыть ни одно хранилище без ключа).
Вы можете сделать example_node->left = 0xdeadbeef
(поместите чье-либо хранилищеключ на крючке), но вы не можете , а затем example_node->left->foo = ...
, потому что пространство в 0xdeadbeef
, скорее всего, не ваше, чтобы вмешиваться (используя чью-то комнату хранения).
Вы можно сделать example_node->left = malloc(...)
(арендовать помещение для хранения и поставить ключ на крюк для хранения), и после этого вы сможете сделать example_node->left->foo = ...
(потому что вы владеете комнатой иключом, и вы можете добавить туда новое, если хотите).