Il punto è che devi aumentare ad ogni iterazione la quantità di memoria allocata; ecco una mia soluzione (che evita la getchar in favore della fgets):
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * GetLine(FILE * File);

int main(void)
{
    char * stringa;
    stringa = GetLine(stdin);
    printf("Hai digitato: %s\n",stringa);
    free(stringa);
    return 0;
}

char * GetLine(FILE * File)
{
    const size_t blockSize=128;
    size_t actualSize = blockSize;
    char * ret = NULL;
    for(;;)
    {
        ret = realloc(ret, actualSize);
        fgets(ret+actualSize-blockSize, blockSize+1, File);
        if(ret[strlen(ret)-1]=='\n')
            break;
        actualSize+=blockSize;
    }
    return ret;
}
.