У меня есть школьный проект по созданию распределителя памяти. Я отлаживал его более 3 дней без какого-либо разумного результата. Внезапно происходит сбой, когда выделяется большее число, например, у меня есть массив из 65000 байт, и я хочу выделить 12000, это не удается. Меньшие числа до 800 прекрасно работают.
Допустим, у нас есть массив c stati, состоящий из 65000 байт. Мы вызываем init, который создает связанный список, который имеет указатель на следующий список и размер списка. Нам также разрешено иметь одну глобальную переменную для указателя на начало массива, который я назвал моим «start». Выглядит это так:
typedef struct mallocstr head;
char* start;
struct mallocstr
{
head* next; //For moving through list
int size; //If allocated then value is <0
};
А вот моя функция выделения:
void* memory_alloc(unsigned int size)
{
head* p = start;
char* endd= end();
while (p != NULL)
{
if (p->size > 0 && p->size >= size + sizeof(p) && size != 0)
{
int newsize = p->size - size - sizeof(p);
//If head is smaller than newsize create next block and allocate this one
if (sizeof(p) < newsize)
{
hlavicka* var;
p->size = (p->size - newsize) * (-1);
int point = p->size;
point*= -1;
p->next= p + sizeof(p) + point;
var= p;
p = p->next;
p->size= newsize;
p->next = NULL;
return (void*)var + 2*(sizeof(int));
}
//If head is greater or same as newsize
else if (sizeof(p) >= newsize)
{
p->size= p->size* (-1);
p->next = NULL;
return (void*)p + 2*(sizeof(int));
}
}
//If we are unable to alocate this block because size is too small or it is allocated we move to
//next one
else if (p->size< size + sizeof(p) && p != endd|| p->size< 0)
{
p = p->next;
}
//When we cannot allocate any block
else if (p->size < size + sizeof(p) && p == endd|| size == 0)
{
return NULL;
}
}
}
Функция end предназначена для получения указателя на конец списка. Вот оно:
void* end()
{
head* p = start;
while (p != NULL)
{
if (p->next== NULL)
{
break;
}
else
p = p->next;
}
return (void*)p;
}