if I have something like
struct Node *root;
struct Node *q;
root = malloc( sizeof(struct Node));
q = root;
free(q);
is the node q is pointing to freed?? or would I have to pass root to the free function?
if I have something like
struct Node *root;
struct Node *q;
root = malloc( sizeof(struct Node));
q = root;
free(q);
is the node q is pointing to freed?? or would I have to pass root to the free function?
Both root and q have the same value, that is to say, they point to the same memory location. After the call to free(q), both of them are dangling pointers because the thing they both point to has been freed but they still point to that location.
To de-reference either would invoke undefined behaviour. This includes calling free on either of them.
After calling free(q) the freed memory is not being cleared or erased in any manner.
Both q and root are still pointing to the allocated memory location but that memory location is added to the list of free memory chunks and can be re-allocated. You are not allowed to reference that memory location by any of these pointers otherwise it will invoke undefined behavior.
The pointers q and root point to the same block of memory after the assignment. So the call to free will free that block and both q and root are left dangling.
You can write
free(q);
or
free(root);
interchangeably since
q == root
After free call both q and root point to freed memory block.
Generally, each resource has to be released only once. This is different from C++, where you can implement (but probably should not) pretty complex logic of resource management.