Давайте посмотрим, что происходит с памятью в вашей программе.Вы начинаете с 3 локальных переменных, все типа Node*
.На данный момент все они указывают на мусор, так как они были объявлены, но не инициализированы.
Возможно, диаграмма памяти ascii (макет зависит от реализации)
list node tail
--------------------------
... | 0xFE | 0x34 | 0xA3 | ...
--------------------------
Вызатем установите список на NULL
, а tail
на адрес узла (отбрасывая его тип, плохая идея), давая вам
list node tail
--------------------------
... | NULL | 0xFE | &list | ...
--------------------------
^ |
+-------------+
Затем вы malloc новый Node
, список настроекна его адрес.
list node tail next value
--------------------------- ------------------
... | NULL | &next | &list | ... | NULL | 100 | ...
--------------------------- ------------------
^ | | ^
| +---------------------+
+--------------+
Далее вы пытаетесь установить tail->next
на узел.Вы сказали, что знаете, что tail
указывает на Node
, когда вы выполняли приведение типа, поэтому компилятор вам верит.Хвост Node
указывает на начало с адреса list
, например
tail list
next value next value
---------------------------------- ------------------
... | NULL | &list->next | &list | ... | NULL | 100 | ...
---------------------------------- ------------------
Затем вы устанавливаете tail->next
на node
, в результате чего list
и node
указывают наlist
структура.
list node tail next value
--------------------------- ------------------
... | &next | &next | &list | ... | NULL | 100 | ...
--------------------------- ------------------
| ^ | | ^
| | +---------------------|
| +-------------+ |
+-----------------------------+
Вы напечатали list
как целое число со знаком ("% d").Это плохая идея - если вы используете 64-битную машину и имеете другие аргументы в выражении printf, они могут быть засорены, вместо этого используйте формат указателя («% p»).list->value
совпадает с node->value
, поэтому все равно будет 100
.
Указатели станут проще, если вы подумаете о том, как они на самом деле представлены в машине - как указатель на огромный массивв котором хранятся все ваши данные (размеры указателей по модулю, виртуальная память и т. д.).
В следующий раз будет проще использовать list = node
.