Всегда желательно объявить переменную-указатель с NULL , например,
int *ptr = NULL;
Скажем, ptr указывает на 0x1000 адрес памяти.
После использования free(ptr)
всегда желательно обнулить переменную-указатель, объявив снова NULL .
e.g.:
free(ptr);
ptr = NULL;
Если не объявлено повторно в NULL , переменная-указатель продолжает указывать на тот же адрес ( 0x1000 ), эта переменная-указатель называется висячий указатель .
Если вы определите другую переменную-указатель (скажем, q ) и динамически назначите адрес новому указателю, есть шанс получить тот же адрес ( 0x1000 ) новой переменной-указателем. Если в этом случае вы используете один и тот же указатель ( ptr ) и обновите значение по адресу, указанному тем же указателем ( ptr ), то программа завершит запись значения в место, куда указывает q (поскольку p и q указывают на один и тот же адрес ( 0x1000 )).
* * +1039 например,
*ptr = 20; //Points to 0x1000
free(ptr);
int *q = (int *)malloc(sizeof(int) * 2); //Points to 0x1000
*ptr = 30; //Since ptr and q are pointing to the same address, so the value of the address to which q is pointing would also change.