ponteiro pendente, motivo da alteração do valor depois de free ()?

No seguinte segmento de código, apósfree(x), porquey tornar-se 0?

Pelo meu entendimento, a memória na pilha que estava sendo apontada porx, e ainda está sendo apontado pory, não foi alocado para outra pessoa, então como ele pode mudar para 0?

Além disso, não acho que sejafree(x) que mudou para 0.

Algum comentário?

#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;
}

questionAnswers(4)

yourAnswerToTheQuestion