Las funciones están bien, lo que ocurre es que en alguna llamada a dichas funciones no le estas pasando bien los parámetros, revisa en que línea de código te esta dando el error y fíjate por qué.
Debes pasarle un puntero a caracter válido, ahí le estás diciendo que el caracter se encuentra en la dirección de memoria 59 y por eso te da violación de segmento.
Necesitas otro apuntador para que vaya avanzando y si te fijas cuando haces realloc nunca varías el tamaño del bloque. Deberías inicializar i en 1 y pasarle el valor de i a realloc como el nuevo tamaño.
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
EDIT: Puedes optar por lo que te dijo rir3760. PD: Recuerda que debes liberar la memoria reservada dinámicamente.