Salve a tutti ho implementato una versione del mergesort che utilizza l'allocazione dinamica del vettore di appoggio per effettuare le operazioni di ordinamento. Ho inserito il controllo per gestire gli errori di allocazione all'interno di questa funzione, solo che non riesco a trovare la strada che mi permetta di fermare la chiamata ricorsiva che genera l'errore e di conseguenza tutte le eventuali altre. Tutto questo deve essere fatto senza forzare l'uscita dalla ricorsione, ma in maniera naturale. Vi ringrazio per l'aiuto e vi posto il codice della funzione ricorsiva MergeSort

codice:
//Funzione ricorsiva utilizzata per dividere il vettore iniziale in sottovettori
//fino a raggiungere il caso banale del vettore di un solo elemento
int MergeSort( SCHEDA** Pers, //Array contenente i contatti da riordinare
               int Inizio, //Inizio del vettore da ordinare (Inizialmente 0)
               int Fine, //Fine del vettore da ordinare
                       //( Inizialmente NumContact-1 )
               int* Error, //Identifica l'eventuale errore di allocazione del
                          //vettore di supporto per effettuare gli ordinamenti
               int (*Confronta)(SCHEDA*, SCHEDA*) //Puntatore a funzione per
                                                  //effettuare i confronti
             )
{
  SCHEDA** TempOrd; //Vettore temporaneo per effettuare l'ordinamento
  int Medio; //Indice mediano del vettore in esame

  if( Inizio < Fine && *Error!=992 )//Se vi sono ancora sottovettori da dividere
                                   //e non è avvenuto un errore di allocazione
  {
    Medio=(Inizio+Fine)/2; //Scelgo il punto medio del vettore in esame
    MergeSort( Pers, Inizio, Medio, Error, (*Confronta) ); //Richiamo sul
                                                        //sottovettore sinistro
    MergeSort( Pers, Medio+1, Fine, Error, (*Confronta) ); //Richiamo sul
                                                          //sottovettore destro
    //Alloco dinamicamente il vettore utilizzato per effettuare l'ordinamento
    TempOrd=(SCHEDA**) malloc( (Fine-Inizio+1)*sizeof(SCHEDA*));
    if( *Error!=992 && TempOrd!=NULL ) //Se il vettore è stato correttamente
                   //allocato e non sono avvenuti errori di allocazione in altre
                   //chiamate ricorsive alla funzione mergesort
    {
      //Effettuo l'ordinamento del sottovettore
      Merge( Pers, TempOrd, Inizio, Medio, Fine, (*Confronta) );

      free( TempOrd ); //Dealloco lo spazio occupato dal vettore utilizzato per
                      //effettuare l'ordinamento
    }
    else *Error=992;
  }

}
Grazie