我当前正在努力实现自己的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 = cur + sizeof(block_t);
由于cur
是block_t *
,因此添加由sizeof(block_t)
自动缩放。这意味着,如果sizeof(block_t)
是16,则将在指针中添加256个字节,这不是您想要的。您可能只想
mem = cur + 1;
在这里,其他地方的类似更改。