У меня есть массив, который инициализируется в функции 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
Большое спасибо.