Semmai...
codice:
stringa=(char*)realloc(stringa,i*sizeof(char));
e subito dopo la printf
codice:
free(stringa);
. Comunque credo che abbia più senso riallocare la memoria solo ogni tanto (ad esempio ogni 1024 bytes).
codice:
    #define BUFFERINCREMENT 1024
    stringa=(char*)malloc(sizeof(char)*BUFFERINCREMENT);
    if(stringa!=NULL) 
        printf("\n > memoria allocata correttamente < ");
    else
    {
        printf("\n > impossibile allocare la memoria < ");
        return 1;
    }
    printf("\nPer terminare l'immissione e visualizzare la stringa premere INVIO\n");
    while((temp=getchar())!='\n'){
           stringa[i]=temp;
           if(!(i%BUFFERINCREMENT)&&i)
           {
               if((stringa=(char*)realloc(stringa,i*sizeof(char)+BUFFERINCREMENT*sizeof(char)))==0);
               {
                   printf("\n > impossibile riallocare la memoria < ");
                   return 2;
               }
           i++;
           }
    }