Molto semplicemente: tu richiami
prova(b);
b contiene l'indirizzo di c, quindi quando entri nella funzione
void prova (int *a) {
ad a viene assegnato l'indirizzo di c.
A questo punto ti basterebbe scrivere
*a=5;
per cambiare il valore di c ma, non si capisce perchè, hai deciso di allocare della memoria e inizializzare il valore del puntatore a, perdendo così l'indirizzo di c....