Да
Да
Да: Блок памяти, магически созданный malloc
(3). Вы присвоили адрес этой памяти, но не саму память каким-либо значимым образом, указателю p
, который является переменной auto
в mycode()
.
Затем вы передаете p
в cleanup()
по значению, которое скопирует указатель и, используя локальную копию для cleanup()
, освободит блок. cleanup()
затем устанавливает свой собственный экземпляр указателя в NULL, но это бесполезно. После завершения функции параметр pointer
перестает существовать.
Возвращаясь к mycode()
, у вас все еще есть указатель p
, содержащий адрес, но блок теперь находится в свободном списке и не очень полезен для хранения до повторного выделения.
Вы можете заметить, что вы все еще можете сохранять и считывать из *p,
, но произойдут различные потери в нисходящем направлении, так как этот блок памяти теперь принадлежит библиотеке, и вы можете повредить ее структуры данных или данные будущий владелец блока malloc ().
Внимательное прочтение о C может дать вам абстрактное представление о времени жизни переменных, но гораздо проще визуализировать почти универсальную (для скомпилированных языков, в любом случае) реализацию передачи параметров и распределения локальной переменной как операции стека. Это помогает пройти курс сборки перед курсом С.