после того, как указатель свободной памяти хранит адрес этой памяти, почему мы не можем напечатать значение этой памяти ???1002*
Поскольку память больше не принадлежит вам.Вы free
сделаете это, что означает, что ОС разрешено использовать ее повторно, как она считает нужным, там, где ей нужно выделить больше памяти.Вы больше не являетесь его владельцем, поэтому у вас больше нет бизнеса, который рассматривает значение данных, хранящихся в этой памяти.
Обратите также внимание на то, что:
int *ptr;
...
printf("Before malloc valu is :%d\n", *ptr);
в равной степени недопустимо.ptr
содержит значение мусора и может указывать куда угодно.Разыменование не гарантирует, что это будет область памяти, к которой вы можете получить доступ.
В обоих этих случаях используется неопределенное поведение , что означает, что стандарт говорит: «НЕ ДЕЛАЙ ЭТОГО», и есливы игнорируете стандарт, ваш код будет ужасно ломаться всякий раз, когда ваш начальник смотрит.
что делает free () do .?
делает все память просто равной 0 ..??
Нет, не обязательно.ОС часто обнуляет неиспользуемую память в фоновом режиме, чтобы звонить на calloc
быстрее, но free
только сообщает операционной системе: «Я закончил с этой памятью, делай с ней все, что тебе нужно».Операционная система обычно обновляет некоторые служебные данные, чтобы указать, что блок памяти больше не принадлежит процессу, так что более поздний вызов malloc
может использовать его, если это необходимо.