Ciao. ho difficolta a creare un albero binario di ricerca con i puntatori a puntatori. Con il singolo puntatore ci sono riuscito. qualcuno saprebbe dirmi dove sbaglio in questo codice?

codice:
typedef struct nodo
   {
     int info;
     struct nodo  *sinistro;
     struct nodo  *destro;
   }nod;

int vuoto(nod **rad)
{
 if((*rad))/*rad == NULL*/
   return 0;/*albero vuoto*/
 else 
   return 1;/*albero non vuoto*/
}

void inserisci(nod **punt,int numero)
{
  if (vuoto(punt))/*se punt==NULL*/
    {
      punt=(nod**)malloc(sizeof(nod));/*inserimento valore*/
      (*punt)->info=numero;
      (*punt)->sinistro=NULL;
      (*punt)->destro=NULL;
    }
  else
    {
      if (numero>(*punt)->info)/*scorriamo a destra*/
         inserisci(&(*punt)->destro,numero);
      else  /*scorriamo a sinistra*/   
         inserisci(&(*punt)->sinistro,numero);
    }
       
}
nod **crea_albero()
{
 int val;
 nod **p;
 *p=NULL;
 do
  {
    printf("INSERIRE VALORE : \n");
    scanf("%d", &val);   
    if (val!=0)     /*possiamo inserire il valore*/
      inserisci(p,val);
   }
 while (val!=0);
 return p;  
}

int main()
{
  nod **rad;
  printf("creazione ALBERO \n");
  rad=crea_albero();
}
il programma appena lo lancio va subito in loop.