Страницы

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

понедельник, 4 марта 2019 г.

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

Есть задание, где стоит реализовать функции malloc, free, check, init. Можно использовать любые функции, кроме вышесказанных. Вот мои попытки реализации malloc:
void *malloc(unsigned int len){ char *arr; for(int i=0; iЯ понимаю, что он не верный, но это пока все, что приходит в голову. Уважаемые знатоки, не могли Вы мне дать направления, как это сделать? Любая помощь, ссылка или алгоритм приветствуется. Есть догадка, чтобы реализовать free, нужно пройтись циклом и задать значение NULL. Но это работает на интерпретированных языках (без типизации, таких как Js, PHP...). А вот как на С это сделать правильно? Изображения задания


Ответ

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

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

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