C - liberando estruturas

Vamos dizer que eu tenho essa estrutura

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

e estou alocando espaço por malloc e preenchendo com alguns valores

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

Qual é a maneira correta e segura de liberar toda a memória tomada por essa estrutura? É "livre (testPerson);" o suficiente ou eu preciso liberar o atributo de cada estrutura, um por um?

Isso me leva a outra questão: como as estruturas são armazenadas na memória? Eu notei um comportamento estranho - quando tento imprimir o endereço da estrutura é igual ao endereço do primeiro atributo.

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

O que significa que este livre (testPerson) deve ser igual a este livre (testPerson-> firstName);

e não é isso que eu quero fazer.

obrigado

questionAnswers(7)

yourAnswerToTheQuestion