codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#ifndef _SCHEDA_DEFINED
#define	_SCHEDA_DEFINED

typedef struct scheda { char nome[15];
                        char cognome[15];
                        char email[30];
                        char telefono[15];
                      } SCHEDA;

#endif

int Allunga
( SCHEDA ***PpTesta, // puntatore al puntatore all'array dei puntatori
  int      *Pn       // puntatore al numero di elementi allocati
);

int CercaPosto
( SCHEDA **Ptesta,   // puntatore all'array dei puntatori
  int    Nelementi   // numero di elementi allocati
);

void EliminaScheda
( SCHEDA **Ptesta, // puntatore all'array dei puntatori
  int    Indice    // indice nell'array del puntatore alla scheda
);

void RiempiScheda
( SCHEDA **Ptesta, // puntatore all'array dei puntatori
  int    Indice,   // indice nell'array del puntatore alla scheda
  char   *Info1,
  char   *Info2,
  char   *Info3,
  char   *Info4     // informazioni da memorizzare
);

void StampaSchede
( SCHEDA **Ptesta,   // puntatore all'array dei puntatori
  int    Nelementi   // numero di elementi allocati
);

void Elabora
( SCHEDA **Ptesta,
  int Nelementi
);

int main(void) 
{   SCHEDA **Ptesta;     // puntatore all`array dei puntatori   
     int    Nelementi;    // numero di elementi allocati          
     
     Ptesta    = NULL;   
     Nelementi = 0;   
     Elabora(Ptesta,Nelementi);   
     StampaSchede (Ptesta, Nelementi);   
     system("PAUSE");   
     return 0; 
}  

void Elabora 
( SCHEDA ****Ptesta,   
  int Nelementi ) 
{   int i,Nuova;     
    char   Info[100];      

    for (i=1; i<=10; i++)   {     
        Nuova = CercaPosto (Ptesta, Nelementi);     
        if (Nuova < 0)       
            if ( Allunga(&Ptesta, &Nelementi) == 0 ) // allocazione avvenuta         
                Nuova = Nelementi - 1;                 // l`ultimo elemento      
        if (Nuova < 0)       printf ("\n *** Impossibile inserire altri elementi ***\n");     
        else     
        {    sprintf (Info, "Elem n.%3d",i);                  
              printf("\n%s",Info);       
              RiempiScheda (Ptesta, Nuova, Info, Info, Info, Info);     
        }   
    } 
}  

int Allunga 
( SCHEDA ***PpTesta, // puntatore al puntatore all'array dei puntatori   
  int      *Pn       // puntatore al numero di elementi allocati ) 
{ SCHEDA **Temp;   
   int    Errore = -1;    

   Temp = (SCHEDA **)realloc(*PpTesta, (*Pn+1)*sizeof(SCHEDA*));   
   if (Temp != NULL)   
   {     Temp[*Pn] = (SCHEDA *)malloc(sizeof(SCHEDA));     
          if (Temp[*Pn] != NULL)     
          {    *PpTesta = Temp;       
                Temp[*Pn]->nome[0] = '\0'; // marca la scheda come disponibile       
                Temp[*Pn]->cognome[0] = '\0';       
                Temp[*Pn]->email[0] = '\0';       
                Temp[*Pn]->telefono[0] = '\0';       
                (*Pn)++;        // senza le parentesi verrebbe incrementato Pn       
                Errore = 0;     // allocazione avvenuta con successo     
          }   
   }   
   return Errore; 
}  

int CercaPosto 
( SCHEDA **Ptesta,   // puntatore all'array dei puntatori   
  int    Nelementi   // numero di elementi allocati ) 
{  int    Indice;    // Partendo dall'ultima scheda, arretra fino a trovare una   // locazione disponibile o a oltrepassare l'array (-1)   

   for ( Indice = Nelementi-1;         
   Indice >=0 && Ptesta[Indice]->nome[0] != '\0';         
   Indice --                                      );    
   return Indice; 
}  

void RiempiScheda 
( SCHEDA **Ptesta, // puntatore all'array dei puntatori   
  int    Indice,   // indice nell'array del puntatore alla scheda   
  char   *Info1,   char   *Info2,   char   *Info3,   char   *Info4     // informazioni da memorizzare ) 
{   strcpy (Ptesta[Indice]->nome, Info1);   
     strcpy (Ptesta[Indice]->cognome, Info2);   
     strcpy (Ptesta[Indice]->email, Info3);   
     strcpy (Ptesta[Indice]->telefono, Info4); 
}  

void EliminaScheda 
( SCHEDA **Ptesta, // puntatore all'array dei puntatori   
int    Indice    // indice nell'array del puntatore alla scheda ) 
{   Ptesta[Indice]->nome[0] = '\0';   
    Ptesta[Indice]->cognome[0] = '\0';    // superfluo   
    Ptesta[Indice]->email[0] = '\0';      // superfluo   
    Ptesta[Indice]->telefono[0] = '\0';   // superfluo 
}  

void StampaSchede 
( SCHEDA **Ptesta,   // puntatore all'array dei puntatori   
int    Nelementi   // numero di elementi allocati ) 
{    int    Indice;    

     printf ("\n-----------------------------------------------------\n");   
     for ( Indice = 0; Indice < Nelementi; Indice ++ )     
         if (Ptesta[Indice]->nome[0] != '\0')       
             printf ("%-15s %-15s %-15s %-15s\n", Ptesta[Indice]->nome, Ptesta[Indice]->cognome, Ptesta[Indice]->email, Ptesta[Indice]->telefono);    
     printf ("\n\n"); 
}
perchè se la funzione StampaSchede la richiamo all'interno di Elabora funziona e se la chiamo nel main non funziona? Come devo modificare il codice per fare in modo di far funzionare StampaSchede quando lo richiamo nel main?