C - estructuras de liberación

Digamos que tengo esta estructura

typedef struct person{
    char firstName[100], surName[51]
} PERSON;

y estoy asignando espacio por malloc y llenándolo con algunos valores

PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");

¿Cuál es la forma correcta y segura de liberar toda la memoria tomada por esa estructura? Es "free (testPerson)"; ¿Es suficiente o necesito liberar los atributos de cada estructura uno por uno?

Me lleva a otra pregunta: ¿cómo se almacenan las estructuras en la memoria? Noté un comportamiento extraño: cuando intento imprimir la dirección de la estructura es igual a la dirección del primer atributo.

printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);

Lo que significa que este free (testPerson) debe ser igual a este free (testPerson-> firstName);

y eso no es lo que quiero hacer.

Gracias

Respuestas a la pregunta(7)

Su respuesta a la pregunta