Hola,
Como bien han respondido anteriormente los compañeros debes realizar un free() después de cada llamada a malloc(), siempre que ya no necesites lo que hayas reservado.
Ésta función te permite asignar espacios de memoria dinámicamente, cuando haces una llamada a malloc y asignas a un puntero esa direccion, esa memoria te pertenece y puedes hacer lo que quieras con ella, cargar datos... Ahora bien, cuando la liberas (free) deja de pertenecerte, y por tanto el OS puede entregar ese espacio a otro programa. En el mejor de los casos si intentas acceder a esa posición a través del puntero que tenías puede que te deje (en caso de que esa posición siga perteneciendo a tu programa pero la esté usando otra variable...) pero la información contenida podrá haber cambiado, y si la modificas puede que estés modificando sin saberlo datos de tu propio programa. En el caso más habitual windows te calzará un famoso "access violation" que no es más que un puntero que apunta a una dirección de memoria que no te pertenece, y no te dejará acceder a esa información.
Por tanto, cuando reservas memoria es tuya, pero cuando la liberas deja de ser tuya. De ahí que te hayan dicho que el puntero debe apuntar a NULL después de hacer free(), pues la dirección a la que apuntaba ese puntero ha dejado de ser tuya y para evitar problemas como los que te he mencionado antes es mejor dejar de apuntar a una dirección que ya no es válida.
Por último decirte que todo buen programador libera siempre los recursos que ya no necesita, y que se debe liberar antes de finalizar el programa todo aquello que has reservado.
En fin espero que te haya quedado un poco más claro....
Un saludo!