Llamo a free (), pero el puntero todavía tiene datos y su contenido no ha cambiado

El código está abajo.

Mi pregunta es sobre el resultado. Quiero entender, ¿por qué después de llamar a free (p) p-> elem se convierte en '0', pero p-> str todavía contiene "hola"?

#define LEN (sizeof(struct node))
typedef struct node
{
       int elem;
       char *str;

}*p_node;
int main(void)
{
    p_node p;
    p=(p_node)malloc(LEN);
    p->elem=99;
    p->str="hello";
    printf("the p->elem:%d\n",p->elem);
    printf("the p->str :%s\n",p->str);
    free(p);
    printf("the p->elem:%d\n",p->elem);
    printf("the p->str :%s\n",p->str);
    return 0;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta