malloc devuelve un void * al bloque o NULL si no hay memoria: chequealo siempre (if (p == NULL) return NULL;) antes de escribir. Y cada malloc tiene su free cuando terminás; en el parcial lo toman. La sección 5.3 de K&R (está en la bibliografía) es la mejor explicación corta del tema.
0