void* p = (void*)malloc(sizeof(struct foo));
free(p);//Is this safe?
void * and free takes
void *, so some of your casts are meaningless, and you're always freeing a
void * even if you're starting with some other sort of pointer.