During my tests, I have found that it is possible to use pointer after free(). I have the following code:
typedef struct{ int module_id; int adc_id;
Because using an invalid pointer invokes undefined behavior. And that means that the behavior is... well... undefined. It's not obliged to crash.