Problemas com Vetor e Alocação de Memória

Implemente, em C, um programa que carregue uma frase a partir do teclado e a exiba na tela.
O Programa principal tem que chamar a função "CarregarFrase e, depois, exibir na tela a frase lida.
Função CarregarFrase: lê uma frase(sentença) a partir do teclado e a retorna. A frase termina com um ponto final(também armazenado). Tem que se gerenciar o armazenamento da frase através de alocação dinâmica de memória, garantindo que só se alocará em memória o exato tamanho necessário ao armazenamento. O protótipo da função é: char* CarregarFrase(void);
Na implementação da função CarregarFrase faça o seguinte:
*Aloque uma quantidade inicial de memória à sua vontade, por exemplo, espaço para 100 caracteres (qtd =100)

  • Faça com que o contador de caracteres armazenados(i) seja igual a 0(zero);
    *Faça:
    -leia 1(um) caractere do teclado para a posição i da área alocada;
    -incremente o contador de caracteres armazenados (por exemplo, i = i + 1);
    -verifique se chegou ao limite de memória alocada( Se “i” é igual a “qtd”). Em caso positivo:
    Aloque mais um pouco de memória, por exemplo, espaço
    para mais 10 caracteres (qtd = qtd +10);
    -até que o caractere lido seja igual a ponto final (.)
    Ao final, verifique se você alocou mais memória do que o necessário (se qtd é maior do que i). Em caso positivo, libere excedente.

Lei a documentação da Função malloc

Notará ser impossível liberar excedente de memória, cabe apenas a espaço completo a partir do primeiro endereço retornado por ela.
veja <stdlib.h>

Sendo assim, é necessário revisão do enunciado.