Simple answer : free(testPerson)
is enough .
Remember you can use free()
only when you have allocated memory using malloc
, calloc
or realloc
.
In your case you have only malloced memory for testPerson
so freeing that is sufficient.
If you have used char * firstname , *last surName
then in that case to store name you must have allocated the memory and that’s why you had to free each member individually.
Here is also a point it should be in the reverse order; that means, the memory allocated for elements is done later so free()
it first then free the pointer to object.
Freeing each element you can see the demo shown below:
typedef struct Person
{
char * firstname , *last surName;
}Person;
Person *ptrobj =malloc(sizeof(Person)); // memory allocation for struct
ptrobj->firstname = malloc(n); // memory allocation for firstname
ptrobj->surName = malloc(m); // memory allocation for surName
.
. // do whatever you want
free(ptrobj->surName);
free(ptrobj->firstname);
free(ptrobj);
The reason behind this is, if you free the ptrobj
first, then there will be memory leaked which is the memory allocated by firstname
and suName
pointers.