Algunos comentarios:
* No es necesario inicializar la variable "newPtr" a NULL ya que en su primer uso almacenas el valor de retorno de realloc.
* No es necesaria la conversión explicita en la sentencia:
ptrString = (char *) newPtr;
* El valor de sizeof(char) siempre es igual a uno, no es necesario indicarlo.
* En la comparación dentro del bucle debes utilizar "i == p4kB - 1", esto para reservar el ultimo elemento del bloque para el '\0'.
* La única forma en que la variable "ptrString" puede almacenar NULL es si la primera reserva de memoria falla (ya que las siguientes con realloc las manejas dentro del bucle), por ende si colocas el bucle dentro de una sentencia condicional if te ahorras varias comprobaciones.
* No es necesario utilizar strlen para conocer la longitud de la cadena ya que ese valor ya lo tienes almacenado en la variable "i".
Con los cambios:
char *leerLinea(void)
{
int c;
size_t p4kB = 4096, i = 0;
void *newPtr;
char *ptrString;
if ((ptrString
= malloc(p4kB
)) != NULL
){ while ((c
= getchar()) != '\n' && c
!= EOF
){ if (i == p4kB - 1){
p4kB += 4096;
if ((newPtr
= realloc(ptrString
, p4kB
)) != NULL
) ptrString = newPtr;
else {
return NULL;
}
}
ptrString[i++] = c;
}
ptrString[i++] = '\0';
}
return ptrString;
}
Un saludo