我正在尝试在C项目中手动实现malloc。这是我的代码:
void *Mem_Alloc(int size) {
struct Node *p, *prevp = head;
if (fitPolicy == P_BESTFIT) {
}
if (fitPolicy == P_FIRSTFIT) {
for (p = prevp->next; ;prevp = p, p = p->next) {
if (p->size >= size) {
if (p->size == size)
prevp->next = p->next;
else {
p->size -= size;
p += p->size;
// p->size = size;
}
head = prevp;
return (void *)(p+1);
}
if (p == head) {
return NULL;
}
}
}
if (fitPolicy == P_WORSTFIT) {
}
return NULL;
}
基本上,我在另一种称为Mem_Init
的方法中调用mmap
;然后,返回的存储映射由变量head
指向。我总是会在Mem_Alloc
中间的评论部分上得到细分故障。我不知道为什么。你们能帮我吗?一些提示?
ughoavgfhw具有正确的方向,但是铸造lvalue不合适。
您可以使用:
void * tmp_p = (void *)p;
tmp_p += p->size;
p = (struct Node *)tmp_p;
不可能确定,但这很可能是因为您期望通过p->size
字节来增加p += p->size
的p
。实际上,这将以p->size
倍*p
的大小增加。如果您要分配的大小小于可用内存的一半,那么即使*p
仅为2个字节,这也会将指针移至端。
要解决此问题,您应该将指针投入到添加的角色指针。
((char*)p) += p->size;