On Mon, Dec 16, 2024 at 17:34:36 +0100, Franco Martelli wrote:
void dealloc()
{
for ( const DIGIT *p = head; p->next != NULL; p = p->next )
if ( p->prev != NULL )
free( p->prev );
free( last );
}
I think you might have an off-by-one error in this function. You stop
the for loop when p->next == NULL, which means you never enter the body
during the time when p == last. Which means you never free the
second-to-last element in the list.
It is p->prev not p->next, by doing so free() don't apply for the "last"
element so I've to free apart
Given a list of 5 items, you will free items 1, 2, 3 (during the loop)
and 5 (after the loop), but not 4.
OK I'll try some test removing the "if statement"
No, it's not the if statement. It's the for loop's iteration condition.
for ( const DIGIT *p = head; p->next != NULL; p = p->next )
Your iteration condition is p->next != NULL so you stop iterating as
soon as p->next == NULL.
Given this linked list:
NULL <- [1] <-> [2] <-> [3] <-> [4] <-> [5] -> NULL
^ ^
head last
Your first loop iteration, when p == head, does nothing because of
the if statement. That's fine.
The second iteration, when p points to [2], frees [1].
The third iteration, when p points to [3], frees [2].
The fourth iteration, when p points to [4], frees [3].
The fifth iteration, when p points to [5], NEVER HAPPENS, because
p->next == NULL at that point, and the for loop stops. So [4] is
not freed.
After the loop, you free [5] which is where last points.