if (p)
free(p);
зачем еще одна явная проверка?
Если I напишет что-то подобное, то для передачи конкретных знаний, что указатель может быть НЕДЕЙСТВИТЕЛЕН ... чтобы помочь в удобочитаемости и понимании кода. Потому что это выглядит немного странно, чтобы утверждать это:
assert(p || !p);
free(p);
(Помимо того, что выглядят странно, компиляторы, как известно, жалуются на «условие всегда истинно», если вы включаете предупреждения во многих таких случаях.)
Так что я считаю это хорошей практикой, если это не ясно из контекста.
Обратный случай, когда указатель ожидается не ноль, обычно очевиден из предыдущих строк кода:
...
Unhinge_Widgets(p->widgets);
free(p); // why `assert(p)`...you just dereferenced it!
...
Но если это неочевидно, утверждение может стоить напечатанных символов.