Наоборот - указатель не сохраняет свое значение после free
.
Стандарт C говорит, что, как только объект становится free
d или, в более общем смыслеего время жизни заканчивается, значения всех указателей, указывающих на объект, становятся неопределенными , и использование такого неопределенного значения может привести к неопределенному поведению, даже если оно просто печатало значение.То, что он выглядит так, как будто он сохраняет свое первоначальное значение, никоим образом не гарантируется.
Это позволяет компилятору C оптимизировать вашу функцию.Например, если он использовал один регистр ЦП для сохранения значения p
, после вызова free(p)
компилятор знает, что регистр теперь можно использовать для чего-то другого, например, для хранения результатовпромежуточные вычисления других операций, и его значение не нужно сохранять до тех пор, пока ему не будет присвоено новое значение.
Что касается адреса памяти двух различных объектов, которые являются одинаковыми - это возможно, если они не живы одновременно.Один объект будет иметь постоянный адрес в течение всего времени его существования.Что происходит после его жизни, не уточняется.malloc
часто реализуется в виде списка свободных блоков, и последний из них free
d, вероятно, будет повторно использован первым.