gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:39:50 24 4
gpt4 key购买 nike

我有一个在 main 函数中初始化的数组,我想使用这个数组作为我的内存块。并在其上实现我自己的 malloc 函数。但是在调用这个数组上的 malloc 之前,我需要将它作为我自己的内存块启动,这样我就可以使用它了。

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

此函数应该将数组作为内存块启动。我正在使用 explicit list allocation (第 15 页),所以在 init 中我基本上会在数组的开头有一个全局指针点,然后我会在内存上设置一个 header :

- 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 等等,那么正确的方法是什么,有没有办法用 outcasting 来做到这一点。

  • 如果我不转换,那么如何进行指针运算 *((char *)ptr + 1) 以在内存点中移动,因为如果您进行指针运算在 void 指针上,它通过错误 expression must be a pointer to a complete object type

非常感谢。

最佳答案

首先,为了避免给自己带来麻烦,我建议使用 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 是指针类型,正如您的大小计算所表明的那样。

关于c - 在 c 中的数组上实现显式列表内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com