ti posto quella che mi son scritto io:
codice:
/*funzione che gestisce lo  storage dinamico in memoria dell'input da tastiera*/
char *input()
{
    int i=0;
    char *p;
    char *e="Memoria insufficiente";
    char carattere;
    
    /*
    alloco la quantità di memoria necessaria a contenere un tipo di dato char
    e faccio il casting del risultato (un puntatore a quella zona di memoria)
    al tipo puntatore di char (char *)    
    */
    p = (char *) malloc(sizeof(char));
    
    if (p==NULL)
    {
        return e;
    }
    
    p[i++]=getchar();
    
    if (p[0]=='\n') /*Caso in cui viene premuto subito invio*/
    {
        p[0]='\0';
        return p;
    }
    
    for(i=1;;i++)
    {   
        /*
        rialloco la memoria in modo da averne disponibile tanta quanta ne serve
        per ospitare (i+1) variabili di tipo char (totale caratteri nell'array)
        */
        p = (char *) realloc (p, (i+1) * sizeof(char));
        
        if (p==NULL)
        {
           return e;
        }
        
        carattere=getchar();
        
        if (carattere=='\n') /*esco dal ciclo (termino la stringa) quando l'utente preme invio*/
        {
           p[i]='\0';
           break;
        }
        else
        {
           p[i]=carattere;
        }
    }
    
    return p;
}