我正在尝试在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;
}
基本上,我在另一个名为mmap
的方法中调用Mem_Init
;然后,返回的内存映射由变量head
指向。
我总是在Mem_Alloc
中间的注释部分上出现分段错误。我不知道为什么。你能帮助我吗?一些提示?
答案 0 :(得分:2)
这是不可能确定的,但这很可能是因为您期望p += p->size
将p
增加p->size
个字节。实际上,这会使p->size
的大小增加*p
倍。如果您尝试分配的大小小于可用内存大小的一半,即使*p
只有2个字节,这也会将指针移到末尾。
要解决此问题,您应该将指针转换为添加的字符指针。
((char*)p) += p->size;
答案 1 :(得分:2)
ughoavgfhw有正确的方向,但是施放左值是不合适的。
您可以使用:
void * tmp_p = (void *)p;
tmp_p += p->size;
p = (struct Node *)tmp_p;