как правильно увеличить размер массива?

Я давно откладывал эту тему, но думаю переходить на компиляцию С++, каждый раз когда мне нужен вектор, будет не самым лучшим решением. я попробовал использовать такой вариант увеличения.

char* screen;
int main() {
screen = malloc(120 * 30);
...

if (x == strlen(screen)) {
    char* _new = realloc(screen, strlen(screen) * 2);
    screen = _new;
}

Я знаю что если на адрес памяти нет ссылок, то ОС сама его очистит. В данном случае я создаю новый указатель и присваиваю старому массиву эту ссылку. Мне нужно чистить _new? Или это не нужно? Если я понял что-то не так, или я просто не внимательный, прошу простить и объяснить.


Ответы (1 шт):

Автор решения: user22405329

Функция realloc может привести к одному из двух результатов:

  • Функция успешно увеличила массив — тогда она вернёт указатель на новый. Старый массив уже удалён, а все данные скопированы в новый. Обратите внимание, что функция может вернуть тот же самый указатель что вы в неё передали — это нормально, это значит что новый массив был создан на месте старого.
  • Недостаточно памяти — функция вернёт NULL. Старый массив не удалён, если он вам не нужен — его нужно удалить с помощью free.

К вашему коду два замечания:

  • Не используйте strlen. Заведите отдельную переменную, которая будет хранить ёмкость массива.
  • Результат realloc нужно проверять на NULL.

Я знаю что если на адрес памяти нет ссылок, то ОС сама его очистит.

Это неправда! ОС очищает память только когда ваша программа завершилась. Если вы хотите вывести сообщение об ошибке и завершить программу — то память освобождать не обязательно. Если же вы хотите продолжить работу — указатели на ненужную память надо передавать в функцию free. Однако помните — некоторые функции (такие как realloc) сами освобождают память — нужно смотреть в справочнике по конкретной функции. Также, ни в коем случае нельзя передавать уже освобождённую память в free во второй раз!

→ Ссылка