facendo diversi test va in loop appena vede l istruzione *p=NULL.
ho provato a fare quest altra versione con void.

codice:
#include <stdio.h>
#include <malloc.h>
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);
    }
       
}
void crea_albero(nod **p)
{
 int val;
 
 do
  {
    printf("INSERIRE VALORE : \n");
    scanf("%d", &val);   
    if (val!=0)        /*possiamo inserire il valore*/
      inserisci(p,val);
  }
 while (val!=0);
}
int main()
{
  nod **rad;
  printf("creazione ALBERO \n");
  *rad=NULL;
  printf("chiamo la funzione \n");
  crea_albero(rad);
}
mi va in loop subito dopo la printf("creazione albero \n");

spero mi aiutate