Has creado un puntero a <char>. Como su nombre indica un puntero apunta y el tuyo no apunta a ningún sitio. Lo que haces con <malloc> es reservar espacio en ese puntero pero en este caso ya tienes una cadena C que es <nombre> entonces con hacer que <p_nombre> apunte a <nombre> ya está.
int main(){
printf("Introduzca su nombre: "); char nombre[20],*p_nombre;
fgets(nombre
, 20, stdin
); p_nombre = nombre;
}
Además de eso te he modificado la función <gets()> ya que es mejor usar <fgets()> y así especificar el número de caracteres que va a coger la función. De todos modos si lo dejas así e introduces 19 o 20 caracteres se te va a quedar el último o los dos últimos en el buffer ya que tienes capacidad para 20 caracteres pero tienes que contar el salto de línea "\n" cuando pulsas enter y el "\0" que indica el final de cadena.