Ваша функция increase_capacity
может изменить адрес, по которому хранятся данные.Но он не возвращает эту информацию вызывающей стороне.Таким образом, getline
запишет на старый адрес буфера.Точно так же main
не может получить новый адрес, поэтому он получит доступ к старому адресу и free
блоку, который уже может быть освобожден.
Кроме того, ваша функция increase_capacity
выделяет память для храненияданные, а затем освобождает эту память.Это не оставляет места для хранения данных!
int increase_capacity(char* s, int capacity)
{
int i;
capacity *= 2;
char *new_s = calloc(capacity, sizeof(char)); // allocate a larger block
copy(s, new_s); // copy the data into the larger block
s = new_s; // stash a pointer to the larger block in a local
free(new_s); // free the block?!
return capacity;
}
Итак, мы выделяем новый блок, копируем в него данные, а затем освобождаем его.Это не имеет смысла, нам нужно сохранить больший блок, поскольку в этом весь смысл функции увеличения емкости.Мы также не возвращаем адрес нового блока, поэтому, даже если мы не освободим его, никакой другой код не сможет получить к нему доступ, и мы просто потеряем его.Двойной упс.
Я предлагаю вам создать struct
, который содержит как указатель на блок, так и его размер.Передайте указатель на этот struct
функциям, таким как increase_capacity
, чтобы он мог изменять указатель, а размер в структуре и вызывающие абоненты могли видеть изменения.