我目前正在实现自己的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个字节。
答案 0 :(得分:1)
无论何时执行指针算术运算,值总是按指针指向的类型的大小缩放。所以当你这样做
mem = cur + sizeof(block_t);
由于cur
是block_t *
,所以加法会自动由sizeof(block_t)
缩放。这意味着如果sizeof(block_t)
为16,则将向指针添加256个字节,这不是您想要的。你可能只想
mem = cur + 1;
在这里,其他地方也有类似的变化。