C-我自己的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个字节。

每当您执行指针算术时,值始终按照指针点的类型大小来缩放。所以当你做

mem = cur + sizeof(block_t);

由于curblock_t *,因此添加由sizeof(block_t)自动缩放。这意味着,如果sizeof(block_t)是16,则将在指针中添加256个字节,这不是您想要的。您可能只想

mem = cur + 1;

在这里,其他地方的类似更改。

相关内容

  • 没有找到相关文章

最新更新