Вам не нужно копировать данные, когда realloc
возвращает другой указатель - это сделано для вас.На самом деле это ошибка , потому что вы копируете данные из источника, которого больше не существует, и вдвое больше, чем было!Таким образом, вам нужно только
data = data_new;
Также эта строка неправильна
data[len] = '0';
, она должна быть
data[len] = '\0';
и может также записывать за пределы памяти.Вы должны проверить размер еще раз, прежде чем писать терминатор, или, проще говоря, перераспределить память, когда используется size-1
, потому что вы знаете, что вам понадобится этот дополнительный байт.
if(len == size - 1) {
// . . .
}
Примечание такжечто если вы вводите символы, каждый из которых разделен символом новой строки, то getchar()
будет читать и каждую новую строку.