как правильно увеличить размер массива?
Я давно откладывал эту тему, но думаю переходить на компиляцию С++, каждый раз когда мне нужен вектор, будет не самым лучшим решением. я попробовал использовать такой вариант увеличения.
char* screen;
int main() {
screen = malloc(120 * 30);
...
if (x == strlen(screen)) {
char* _new = realloc(screen, strlen(screen) * 2);
screen = _new;
}
Я знаю что если на адрес памяти нет ссылок, то ОС сама его очистит. В данном случае я создаю новый указатель и присваиваю старому массиву эту ссылку. Мне нужно чистить _new? Или это не нужно? Если я понял что-то не так, или я просто не внимательный, прошу простить и объяснить.
Ответы (1 шт):
Функция realloc может привести к одному из двух результатов:
- Функция успешно увеличила массив — тогда она вернёт указатель на новый. Старый массив уже удалён, а все данные скопированы в новый. Обратите внимание, что функция может вернуть тот же самый указатель что вы в неё передали — это нормально, это значит что новый массив был создан на месте старого.
- Недостаточно памяти — функция вернёт NULL. Старый массив не удалён, если он вам не нужен — его нужно удалить с помощью
free.
К вашему коду два замечания:
- Не используйте
strlen. Заведите отдельную переменную, которая будет хранить ёмкость массива. - Результат
reallocнужно проверять на NULL.
Я знаю что если на адрес памяти нет ссылок, то ОС сама его очистит.
Это неправда! ОС очищает память только когда ваша программа завершилась. Если вы хотите вывести сообщение об ошибке и завершить программу — то память освобождать не обязательно. Если же вы хотите продолжить работу — указатели на ненужную память надо передавать в функцию free. Однако помните — некоторые функции (такие как realloc) сами освобождают память — нужно смотреть в справочнике по конкретной функции. Также, ни в коем случае нельзя передавать уже освобождённую память в free во второй раз!