使用C语言实现Malloc函数

3

我正在尝试在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 给出了正确的方向,而注释中的 size 行不正确。应该是 p->size = the_size_left_in_the_block - SwiftMango
2个回答

2

ughoavgfhw的方向是正确的,但将lvalue转换成其他类型并不合适。

你可以使用以下方法:

void * tmp_p = (void *)p;
tmp_p += p->size;
p = (struct Node *)tmp_p;

2
void* 上的指针算术是 GCC 的扩展(根据标准是未定义行为)。为了可移植性,请使用 char* - Daniel Fischer
谢谢大家。我使用了 char 强制转换方法。 - Kevin Soewondo

2
很难确定,但最有可能的原因是您期望p += p->sizep增加p->size字节。实际上,这将使其增加p->size倍的*p大小。如果您尝试分配的大小小于可用内存的一半,则即使*p只有2个字节,这也会将指针移动到末尾之后。
要解决此问题,您应该将指针转换为字符指针以进行加法运算。
((char*)p) += p->size;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接