инициализация структуры данных в C для управления пулом памяти - PullRequest
0 голосов
/ 07 марта 2011

Я пишу простую функцию для библиотеки, которая будет принимать в качестве параметра размер памяти, который будет управляться моими другими функциями.

У меня есть структура данных, которая содержит информацию об этом большом пуле памяти, инициализированном пользователем.

typedef struct memBlock{
    struct memBlock* next;
    unsigned int size;  // Size of this block
    unsigned int is_used;  // bool 0 = not used 1 = used
}  memBlock;

У меня также есть эта функция, которую я пытаюсь выяснить, как инициализировать эту структуру данных, а также выделить достаточно места для первоначального управления?

int initialize_memory(unsigned long size){

    memBlock *ptr; // the beginning of our whole memory to be handled

    ptr = malloc(size); // this is the ptr to the original memory first allocated.
    ptr->next = NULL;
    ptr->size = NULL;
    ptr->is_used = 0;

    has_initialized = 1; // the memory has been initialized
}

помогите пожалуйста

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Измените ptr->size = NULL; на ptr->size = size;. Вам также необходимо вернуть ptr или сохранить его где-нибудь. Ваша функция возвращает int, но вы ничего не возвращаете. has_initialized кажется ненужным - вы знаете, что инициализировали, потому что ваш пул памяти (значение ptr, которое вы вернете) не NULL. Если вам нужна дополнительная помощь, вам придется объяснить больше.

Добавление: вам необходимо решить, является ли memBlock.size размером выделенного пространства или размером блока памяти, представляемого memBlock ... если последнее, то вам необходимо учитывать пространство, занимаемое мембраной сам вычитая это из выделенного вами пространства: ptr->size = size - sizeof(struct memBlock); Вам также нужен способ адресации вашего пула памяти ... так как он сразу следует за memBlock, его адрес равен (ptr + 1) или &ptr[1] (если вы не Чтобы понять это, найдите «арифметику указателей в C»).

P.S. Вы написали в комментарии: «По сути, у меня также есть другая функция, которая будет действовать как« malloc », чтобы зарезервировать количество байтов, но сначала проверит эту структуру данных, чтобы узнать, доступна ли какая-либо память из моего пула»

Почему вы хотите это сделать? malloc уже управляет памятью намного лучше, чем ваша функция, учитывая уровень навыков и затраченное время, и нет никакого смысла размещать другой распределитель памяти поверх него. Если это не школьный проект по написанию распределителя памяти, в этом случае вы должны сказать это заранее.

0 голосов
/ 07 марта 2011
typedef struct memBlock {
   unsigned int size;
   unsigned int initialized;
   void* block;
} memBlock;

memBlock* new_memBlock(unsigned int size)
{
    memBlock* memblock;

    memblock = malloc(sizeof(memBlock));

    if (memblock)
    {
        memblock->size = size;
        memblock->block = malloc(size);

        if (memblock->block)
            memblock->initialized = 1;
    }

    return memblock;
}

void free_memBlock(memBlock** memblock)
{
    if (*memblock)
    {
        free(*memblock->block)
        *memblock->block = 0;
    }

    free(*memblock);
    *memblock = 0;
}

void main()
{
    memBlock* memblock = new_memBlock(1024);

    if (memblock && memblock->initialized)
        printf("Initialized\n");
    else
        printf("Not initialized\n");

    free_memBlock(&memblock);
}
...