Вы не определяете EOF надежно. Вам нужно сохранить результат getchar()
в int
, а не char
. И вы не должны пытаться хранить EOF
в вашем буфере.
Вы не проверяете распределение памяти.
Вы не заканчиваете нулевую строку, поэтому printf()
в main()
может дать сбой.
Вы вводите в заблуждение кого-то (может быть, меня, может быть, компилятор, может быть, себя), выделяя 51 байт и сообщая функции, что у нее есть только 50 байтов для игры.
И, в частности, вам необходимо использовать *buff
в большинстве точек внутри функции , в том числе, в частности, при добавлении символа:
(*buff)[length++] = c;
Вы действительно должны уделять больше внимания всем этим предупреждениям компилятора. Если ваш компилятор не дает его, приобретите лучший компилятор (или включите предупреждающие флаги, но компилятор должен вызывать вас в его режиме по умолчанию).
Кроме того, вы ошибаетесь realloc()
по трем причинам. Одним из них является *buff
проблема. Во-вторых, вы хотите, чтобы размер был k
, а не start_size + 1
. Другое - вы присваиваете результат входному параметру. Это «нет-нет», потому что если выделение не удастся, вы потеряете указатель на ранее (и до сих пор) распределенные данные. Всегда используйте идиому:
void *new_data = realloc(old_data, new_size);
if (new_data == 0)
...deal with out of memory error...
else
{
old_data = new_data;
old_size = new_size;
}
Применительно к вашему коду это означает:
char *new_buff = (char *)realloc(*buff, k); // NOT start_size+1!!!
if (new_buff == 0)
...deal with out of memory error...
else
*buff = new_buff;
Есть те, кто оспаривает приведение на malloc()
и realloc()
и calloc()
; Есть те, кто предпочитает присутствующие слепки. Есть аргументы с обеих сторон, разной степени обоснованности. Я предпочитаю актерский состав - я уважаю тех, кто предпочитает не актерский состав. Мы пришли к разным выводам по разным причинам.
Я не изучал код для других ошибок «off-by-one». Я подозреваю, что таких тоже может быть несколько.