реализация явного распределения памяти списка на массиве в c - PullRequest
0 голосов
/ 09 октября 2018

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

Теперь у меня есть функция с именем init(void *ptr, int size) указатель ptr voidначало массива, а size - размер массива.

Предполагается, что эта функция инициирует массив как блок памяти.Я использую явное выделение списка (стр. 15), поэтому в init у меня в основном будет точка глобального указателя в начале массива, затем я установлю заголовок в памяти:

- flag: block is free or allocated 'in init function it will be free'.
- size: the size of the array.
- *next: which points at the next free block.
- *prev: points at the previous free block.

Теперь моя проблема в том, как заполнить заголовок, мой текущий "нефункциональный код":

  void init_mem(void *ptr, unsigned int size)
{

 GLOBAL_POINTER = ptr;

 *(char *)ptr = FREEMEM; // FREEMEM is a const which : free memory block

  // ptr + 1 is the second spot on the memory block, for the size of the array
 *((char *)ptr + 1) = size - sizeof(int) - (sizeof(char *) * 3);

  //because the ehole memory block is free now, the next and prev pointers points to the same block
 *((char **)ptr + 3) = (char *)ptr;
 *((char **)ptr + 4) = (char *)ptr;


}

Моя проблема сейчас заключается в установке этой информации, и проблемы:

  • если я приведу ptr к примитивному типу, чтобы я мог его использовать, и если да, то какой тип подходит, потому что int занимает 4 байта, где char занимает 1 и так далееИтак, как правильно это сделать и есть ли способ сделать это с изгнанием.

  • , если я не разыграю, то как сделать арифметику с указателями *((char *)ptr + 1)перемещаться в местах памяти, потому что если вы делаете арифметику указателей на пустом указателе, это происходит через ошибку expression must be a pointer to a complete object type

Большое спасибо.

1 Ответ

0 голосов
/ 09 октября 2018

Прежде всего, чтобы не причинять себе горе, я бы порекомендовал сделать всю арифметику указателей с использованием указателей void, а затем привести результат к соответствующему типу указателя.Например, в строке

*((char **)ptr + 3) = (char *)ptr;

вы фактически добавляете 3*sizeof(char**) вместо 3 байтов.Использование void* для арифметики решает эту проблему.Размер int в C может быть 4 или 8 байт в зависимости от платформы, поэтому вам нужно будет использовать sizeof.Я думаю, что это то, что вы хотите:

void init_mem(void* ptr, unsigned int size)
{

    GLOBAL_POINTER = ptr;

    *(void**)ptr = FREEMEM; // FREEMEM is a const which : free memory block

    // the second spot on the memory block, for the size of the array
    *(unsigned int*)(ptr + sizeof(void*)) = size - sizeof(unsigned int) - 3 * sizeof(void*);

    //because the ehole memory block is free now, the next and prev pointers points to the same block
    *(void**)(ptr + sizeof(void*) + sizeof(unsigned int)) = ptr;
    *(void**)(ptr + 2 * sizeof(void*) + sizeof(unsigned int)) = ptr;

}

Предполагая, что FREEMEM является типом указателя, как, кажется, указывает ваш размер расчета.

...