Почему висячий указатель не может хранить какое-либо значение и почему он выбрасывает 0?
Почему висячий указатель не может хранить никаких значений и почему он выбрасывает 0? Как это указывает на ту же память, которая освобождается. почему 0, если мы пытаемся сохранить какое-то значение?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p;
p=(int*)malloc(sizeof(int)*5);//allocating memory in heap
printf("%p\n",p);
free(p); //freeing memory
printf("%p\n",p); //still pointer same loaction(dangling pointer)
scanf("%d",p); // why cant i scan if it is still pointing same location
// i know memory is delete but why 0 is thrown?
printf("%d\n",*p);// i am getting zero here?
}
2 ответа
Решение
Это незаконный доступ к памяти. Адрес не должен использоваться после освобождения.
После освобождения адреса установите указатель на NULL. Так что незаконный доступ к памяти будет ликвидирован.
Пример:
free(p);
p=NULL;
Доступ к освобожденной памяти - неопределенное поведение. Все может случиться. На этот раз у вас ноль, и в следующий раз вы можете получить что угодно.
http://en.wikipedia.org/wiki/Undefined_behavior для справки