lets say we have a linked list = [1] -> [2] -> [3] -> [4]
typedef struct Node
{
int val;
struct Node* next;
}Node;
I have the head and to free all the allocated memory I do
printf("%i", head->val); // prints 1
Node* tmp = head;
while(tmp != NULL)
{
Node* tmp2 = tmp;
tmp = tmp->next;
free(tmp2);
}
printf("%i", head->val); // prints a big number, but exists and is not NULL
if (tmp == NULL)
{
print("is null"); // this prints too
}
why head->val still exists and tmp doesn't? shouldn't head->val be NULL after freeing it ? I assumed since head is a pointer itself and i set it to another pointer then its pointing at the location anyway so when I free tmp it should free the thing in the address that head is pointing to aswell?
As stated in comments, attempting to access member of head
after freeing it invokes undefined behavior. head->val
might be NULL
, or it might still have a value because that memory has not been overwritten.
The point of undefined in "undefined behavior" is that we don't know and can't know for sure what will happen.