p = malloc(...);
q = malloc(...);
/* free (p); */
p = q;
After q is assigned to p, both point the the second memory block. There are no pointers to the first block. This memory block cannot be accessible to program, it is called ‘garbage’. A program that leaves garbage behind has memory leak. C doesn’t have garbage collector.You can use ‘free(p)’ to release the memory block that p points to.
After you released the memory block, if you attempt to access or modify this deallocated memory block, it causes undefined behavior.