alex4answ
@alex4answ

Как правильно изменить размер выделенной памяти?

Добрый день, есть задача:

Реализовать функцию getline, которая будет считывать поссимвольно ввод и вернет C-style строку.

дана начальная сигнатура функции:
char *getline();
И тут еще один вопрос попути)
Разве функция должна вернуть строку, а не указатель на нее ?

Ну и в общем то основной вопрос:
Я знаю как выделять память, с этим проблем вроде как нет, но изначально мы не знаем сколько символов будет дано, выходит нам нужно считывать и перевыделять память, так?
Не слишком ли это "дорого" ?

Я знаю как выделять память в стиле C и C++
В C есть realloc - которая сама изменит размер выделенной памяти

А вот в стиле C++ нет.
Если я выделяю память:
new [], то для изменения размера, мне нужно удалить ее delete[] и выделить новую размером больше, так?

И выходит что для реализации необходимой функции (считать посимвольный ввод и вернуть C-style строку), нужно будет удалять выделенную память и создавать больше, и так при каждом новом символе, пока не дойдем до конца?

Пока мне кажется это каким-то оченьсильным костылем, и проще воспользоваться realloc т.к он сам все сделает
  • Вопрос задан
  • 622 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
В Cи нет строк как таковых - там строка это массив байт с завершающим нулевым байтом в конце.
А массив в Си - это указатель.
В С++ используйте string - его для этого и придумали, чтоб не парится в каждом приложении с подобными вещами.

Если чисто в Си, то на каждый символ, конечно дергать память не выгодно, поэтому выделяйте память кусками.
Например - задавайте фиксированный начальный размер буфера и размер приращения. Часто, вместо приращения удваивают размер буфера. Стратегия может быть разной. Для простых приложений можно вообще выделить фиксированный размер буфера (достаточно большой) и не перевыделять память.
Не забывайте для обозначения конца строки вручную вставлять нулевой байт в конце строки. Конец строки не обязан совпадать с концом буфера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы