Let’s say I have this struct
typedef struct person{
char firstName[100], surName[51]
} PERSON;
and I am allocating space by malloc and filling it with some values
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");
What is the correct and safe way to free all memory taken by that struct? Is “free(testPerson);” enough or do I need to free each struct’s attribute one by one?
It leads me to another question – how are structures stored in memory? I noticed a strange behaviour – when I try to print structure address it’s equal to it’s first attribute’s address.
printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);
Which means that this
free(testPerson)
should be equal to this
free(testPerson->firstName);
and that’s not what I want to do.
Thanks
Simple answer :
free(testPerson)is enough .Remember you can use
free()only when you have allocated memory usingmalloc,callocorrealloc.In your case you have only malloced memory for
testPersonso freeing that is sufficient.If you have used
char * firstname , *last surNamethen 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:
The reason behind this is, if you free the
ptrobjfirst, then there will be memory leaked which is the memory allocated byfirstnameandsuNamepointers.