Search code examples
cmallocfree

value inside a linked lists Node exists after change, why?


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?


Solution

  • 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.