Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как создать аналог malloc, free, check, init

#c #алгоритм #память


Есть задание, где стоит реализовать функции malloc, free, check, init. Можно использовать
любые функции, кроме вышесказанных.
Вот мои попытки реализации malloc:

void *malloc(unsigned int len){
  char *arr;
  for(int i=0; i


Ответы

Ответ 1



Ну смотрите. Откуда брать память, вам заботиться не нужно: у вас память передаётся вашему алгоритму (см. пример, в котором она выделяется на стеке), так что вы просто работаете с переданной памятью. Теперь, вам нужно организовать список блоков памяти. Для этого вам нужно написать структуру данных, описывающую блок памяти: его размер, положение, признак того, он занят или нет, и указатель на следующий блок. Где размещать этот список? Понятно, где: в вашей выделенной памяти! Внутри блока, кроме вот этой вот служебной информации, должна быть ещё и сама память (она у вас, понятно, будет по фиксированному смещению от начала блока). Процедура инициализации сводится при этом к помещению в список одного большого блока памяти. Более сложным является malloc: вам необходимо пройти по связному списку блоков (вначале в нём только один блок, но потом будет больше), найти первый подходящий по размеру, и откусить от него кусок нужного размера. При этом найденный блок разобьётся на два: выделенный кусок и остаток. Впрочем, остаток может быть настолько мал, что в него не поместится заголовок блока, и тогда вы отдадите целый кусок. Не забывайте, что вы отдаёте юзеру не указатель на весь блок памяти (зачем он ему?), а на начало памяти в нём. free должно быть симметричным: вы получаете на вход указатель на кусок памяти, и помечаете его свободным. Не забудьте от указателя на память вашего блока перейти к указателю на сам блок. Если до него или после него находятся свободные блоки, их можно слить в один блок. Код и структуры данных намеренно не даю, это ж учебное задание. Дерзайте, у вас хороший предмет и хороший преподаватель, вы многому научитесь!

Комментариев нет:

Отправить комментарий