puntero colgante, razón del cambio de valor después de free ()?

En el siguiente segmento de código, despuésfree(x), por quey convertido en 0?

Según tengo entendido, el recuerdo en el montón al que apuntabax, y todavía está siendo señalado pory, no se ha asignado a otra persona, entonces, ¿cómo puede cambiar a 0?

Y además, no creo que seafree(x) eso lo cambió a 0.

¿Algún comentario?

#include <stdio.h>

int main(int argc, char *argv[])
{
    int *y = NULL;
    int *x = NULL;

    x = malloc(4);
    *x = 5;

    y = x;
    printf("[%d]\n", *y); //prints 5

    free(x);

    printf("[%d]\n", *y); //why doesn't print 5?, prints 0 instead

    return 0;
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta