我有一个在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 }}
非常感谢您。
答案 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
是指针类型。