【问题标题】:Issue with pointer arithmetic in my own malloc() function我自己的 malloc() 函数中的指针算术问题
【发布时间】:2018-12-18 21:42:53
【问题描述】:

我目前正在实现我自己的 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 字节。

【问题讨论】:

标签: c pointers memory malloc


【解决方案1】:

每当您进行指针运算时,值总是按指针指向的类型的大小进行缩放。所以当你这样做时

mem = cur + sizeof(block_t);

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

mem = cur + 1;

这里,以及其他地方的类似变化。

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 2016-07-30
    • 1970-01-01
    • 2011-02-03
    • 2023-03-10
    • 2016-08-19
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多