Есть задание, где стоит реализовать функции malloc, free, check, init. Можно использовать любые функции, кроме вышесказанных.
Вот мои попытки реализации malloc:
void *malloc(unsigned int len){
char *arr;
for(int i=0; i
Ответ
Ну смотрите.
Откуда брать память, вам заботиться не нужно: у вас память передаётся вашему алгоритму (см. пример, в котором она выделяется на стеке), так что вы просто работаете с переданной памятью.
Теперь, вам нужно организовать список блоков памяти. Для этого вам нужно написать структуру данных, описывающую блок памяти: его размер, положение, признак того, он занят или нет, и указатель на следующий блок. Где размещать этот список? Понятно, где: в вашей выделенной памяти! Внутри блока, кроме вот этой вот служебной информации, должна быть ещё и сама память (она у вас, понятно, будет по фиксированному смещению от начала блока).
Процедура инициализации сводится при этом к помещению в список одного большого блока памяти.
Более сложным является malloc: вам необходимо пройти по связному списку блоков (вначале в нём только один блок, но потом будет больше), найти первый подходящий по размеру, и откусить от него кусок нужного размера. При этом найденный блок разобьётся на два: выделенный кусок и остаток. Впрочем, остаток может быть настолько мал, что в него не поместится заголовок блока, и тогда вы отдадите целый кусок. Не забывайте, что вы отдаёте юзеру не указатель на весь блок памяти (зачем он ему?), а на начало памяти в нём.
free должно быть симметричным: вы получаете на вход указатель на кусок памяти, и помечаете его свободным. Не забудьте от указателя на память вашего блока перейти к указателю на сам блок. Если до него или после него находятся свободные блоки, их можно слить в один блок.
Код и структуры данных намеренно не даю, это ж учебное задание. Дерзайте, у вас хороший предмет и хороший преподаватель, вы многому научитесь!
Комментариев нет:
Отправить комментарий