Почему висячий указатель не может хранить какое-либо значение и почему он выбрасывает 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 для справки

Другие вопросы по тегам