Это не может.
Это будет:
char * a = malloc(556);
char * b = a;
free(a);
a = NULL;
b теперь висячий указатель, потому что объект, на который он указывал, исчез, но b
все еще сохраняет адрес в памяти, где был объект, вы получаете забавные результаты, когда пытаетесь получить к нему доступ - это зависит от того, была ли память повторно использована или нетронута.