El error como tal está en las cabeceras.
Estás incluyendo dos veces <string.h> cuando no la usas para nada y no estás incluyendo <stdlib.h> que es la que contiene las funciones malloc() y free().
Supongo que es un programa de prueba porque digamos que no sirve de mucho imprimir el valor de un puntero cuando ya lo has liberado.
Además es aconsejable castear el valor de retorno de malloc() ya que es <void*>:
int *p
= (int*)malloc(sizeof(int));
Y en el caso de que no haya espacio para reservar el puntero, el trozo del if-else funcionará bien pero al llegar a la línea 14, intentarás liberar una memoria que no está reservada... -> Error.