在C中的数组上实现显式列表内存分配

时间:2018-10-09 11:37:47

标签: c algorithm pointers memory-management malloc

我有一个在main函数中初始化过的数组,我想将此数组用作我的内存块。并在上面实现我自己的malloc函数。 但是在对该数组调用我的malloc之前,我需要将其初始化为自己的内存块,以便随后使用它。

现在我有一个名为init(void *ptr, int size)的函数,ptr空指针是数组的开始,而size是数组的大小。

该功能应将阵列初始化为存储块。 我正在使用explicit list allocation(第15页),因此在初始化中,我基本上将在数组的开头有一个全局指针,然后在内存上设置一个头文件:

- 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)来移动内存点,因为如果您对void指针进行指针算术,则会通过错误{{1 }}

非常感谢您。

1 个答案:

答案 0 :(得分:0)

首先,为避免引起痛苦,我建议使用void指针进行所有指针算术,然后将结果强制转换为合适的指针类型。例如,在该行

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

您实际上是在添加3*sizeof(char**)而不是3个字节。使用void*进行算术可解决此问题。根据平台的不同,C中int的大小可以为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是指针类型。