Вы освобождаете не указатели, а выделенные вами блоки памяти, адрес которых указывает указатель.
При malloc
возвращается указатель на выделенную часть памяти, которая выглядит какэто:
+--------+
| |
new_node --> | 0x1000 |
| |
+--------+
Если 0x1000
является начальным адресом этого блока памяти, это то, на что new_node
указывает (т.е. new_node == 0x1000
).
Когда вы назначаете *От 1012 * до temp_node
, temp_node
указывает на один и тот же блок памяти (т. Е. temp_node == 0x1000
):
+--------+
| |
new_node --> | 0x1000 | <-- temp_node
| |
+--------+
Но есть только один выделенный вами блок памяти. Поэтому, как только вы освободите его с помощью одного указателя, другой автоматически станет недействительным, и вам больше не будет разрешен доступ к этому блоку с помощью любого указателя.
Таким же образом вы можете назначить его любому количеству указателей, но как только он будет свободен через один указатель, это будет сделано. Вот почему необходимо соблюдать осторожность при копировании указателей (потому что если вы освобождаете один из них, он все равно может непреднамеренно использоваться).
PS: указатель Free'd может указывать или не указывать на NULL впоследствии - это просто неопределенное поведение длядоступ к свободной памяти.