【发布时间】: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;
}
}
}
Curr 和 Freelist 都是 block_t 结构。我知道问题一定出在我设置mem=curr+sizeof(block_t) 的步骤中,但我不确定如何解决它。经过一番检查,我注意到第一次内存分配返回的地址距离数组开头 276 字节,块位于其顶部,而在第一次分配后,块的内存地址距离数组 512 字节。
【问题讨论】:
-
mem=curr+sizeof(block_t) return mem;是语法错误。请发帖minimal reproducible example。