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.