Ошибка распределителя с большими числами - PullRequest
0 голосов
/ 15 марта 2020

У меня есть школьный проект по созданию распределителя памяти. Я отлаживал его более 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;
}
...