所以我有这个赋值来实现我自己的malloc并在C中释放.问题是memory_free(void * ptr)函数的一个要求.如果指针无效,它必须返回1,即它还没有被memory_alloc(unsigned int size)分配,否则返回0.我只是无法找到一种方法来做到这一点,而不是绝对时间效率低下.
所以我的内存结构是这样的:我有一个指向数组开头的全局指针,我可以充当堆.每个内存块都有一个int标头来告诉它的大小以及它是否空闲.
这是我的memory_free(void * ptr)函数,TYPE是typedef unsigned int:
int memory_free(void *ptr)
{
void *head = ptr;
if (head == NULL)
return 1;
head -= sizeof(TYPE);
if (!((*(TYPE*) head) & 1 ))
return 1;
(*(TYPE*) head) &= ~0x1;
return 0;
}
指针ptr指向用户块的第一个字节,这意味着如果我想读取头,我必须返回4个字节.检查指针有效性的一个解决方案是从头开始查看堆,看看我是否得到了有问题的标题,但这不是时间效率.谁能告诉我一个更好的方法?
最佳答案 一个O(1)解决方案是使头部为8个字节而不是4个字节;使用额外的四个字节来表示有效性.例如,它可能是您在其他四个字节中存储的内容的补码.所以你看看标题,如果那些额外的字节包含除了标题第一部分的补码以外的任何内容,你知道它不是一个有效的块.