我自己的malloc()函数中的指针算术问题

时间:2018-12-18 21:42:53

标签: c pointers memory malloc

我目前正在实现自己的malloc()函数。似乎不起作用的一件事是,我无法正确返回当前块开头的内存地址。我的块结构看起来像这样,大小为16:

typedef struct block {
    size_t size;
    struct block* next;
    struct block* prev;
    int free;
} block_t;

我的malloc当前如下:

void *bmalloc(size_t size)
{
    void * mem=0;
    size_t alloc=size;
    if (freelist==0)
    {
        freelist=&heap[0];
        freelist->free=0;
        freelist->prev=0;
        freelist->size=MAX_HEAP_SIZE;
        freelist->next=0;
        //printf("is this happening?");
    }

    for (curr=freelist;curr!=NULL;curr=curr->next)
    {
        if (alloc<=curr->size && curr->free==0)
        {
            block_t *tmp=curr->next;
            curr->free=1;
            curr>size=MAX_HEAP_SIZE;
            curr>next=curr+alloc+sizeof(block_t);
            //curr->next->next=tmp;
            curr->next->size=curr->size-alloc;
            curr->next->free=0;
            curr->next->prev=curr;
            mem=curr+sizeof(block_t)
            return mem;
        }
    }
}           

CurrFreelist均为block_t结构。我知道问题一定出在我设置mem=curr+sizeof(block_t)的步骤中,但是我不确定如何解决它。经过一番检查后,我注意到第一次分配内存返回的地址距离块的开头位于数组的开头276个字节,而在第一次分配之后,这些块的内存地址距离为512个字节。

1 个答案:

答案 0 :(得分:1)

无论何时执行指针算术运算,值总是按指针指向的类型的大小缩放。所以当你这样做

mem = cur + sizeof(block_t);

由于curblock_t *,所以加法会自动由sizeof(block_t)缩放。这意味着如果sizeof(block_t)为16,则将向指针添加256个字节,这不是您想要的。你可能只想

mem = cur + 1;

在这里,其他地方也有类似的变化。