висячий указатель, причина изменения значения после free ()?

В следующем сегменте кода послеfree(x), Почемуy стать 0?

Насколько я понимаю, память в куче, на которую указывалxи до сих пор указывает наy, не был назначен кому-то еще, так как это может измениться на 0?

И более того, я не думаю, что этоfree(x) это изменило его на 0.

Любые комментарии?

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