Динамическое выделение памяти в си

Вопрос покажется, наверное, простым, но не для меня. Заранее неизвестен размер, всё зависит от желания пользователя. Объявление структуры:

struct Book* books;

Затем, если человек захочет, он может создать ещё 1 книгу, я выделяю память под него таким образом:

books = (struct Book*)malloc(sizeof(struct Book));

Но как я понял, я не добавляю в память ещё место, а только лишь отчищаю и выделяю новую память, поэтому могу иметь только 1 книгу в структуре. Как со временем добавлять в память место по мере добавления 1 книгой? Объявлять заранее сколько-то место не является оптимальным, так как не знаем, сколько нужно будет добавлять, всё решается в прайм-тайм.

Или всё решается объявлением struct Book** books?


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

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

Для перераспределения памяти попробуйте использовать realloc(). https://ru.cppreference.com/w/cpp/memory/c/realloc

→ Ссылка
Автор решения: Dmitry Safonov

Realloc использовать в этом случае не вариант, так как то, что он делает - это выделяет динамически большее место в памяти, затем копирует данные и предыдущего меньшего места, а затем очищает то меньшее место. Представь у тебя уже занят 1 Гбайт пямяти и ты делаешь realloc на 1 Гбайт + 1 байт. В этом случае тебе надо будет выделить заново 1 Гбайт + 1 байт, скопировать 1 Гбайт и очистить 1 Гбайт. Очень не производительно! В двоём случае надо реализовать абстрактный тип данных список, односвязный или двусвязный. Можень использовать готовые решения из многих библиотек (glib к примеру) или самому написать, включив операции создания списка, добавления элемента, удаления элемента и поиска элемента. Каждый элемен спмска будет в качестве данных содержать указатель на выделенную так-же динамически память под структуру книги с информацией о ней.

→ Ссылка