要重新编码malloc函数,我做了一个sbrk(stack)
,其中:
void *malloc(size_t size)
{
stack = 0;
while (stack < size)
stack += 4096;
}
我总是比我需要的更多,然后我想拿一些大小为 size
的分配区域并返回它,如果我想在我已经分配内存后再做一个 malloc,这样我就不必多次调用 sbrk。我怎么能做到这一点,我试图回去brk(start_of_the_allocated_space)
,sbrk(size)
有我需要的空间的开始和结束,但它有段错误。
编辑:
struct s_block {
size_t size;
struct s_block *next;
struct s_block *prev;
void *start;
void *end;
}
这是我的结构。然后我有一个创建块的函数
struct s_block *create_block(size_t size, unsigned int stack)
{
struct s_block *block;
block = sbrk(sizeof(s_block));
block->start = sbrk(stack);
block->size = stack;
block->end = sbrk(0);
block->next = set_free_space(size, block);
block->size -= size;
block->next->prev = block;
block->prev = NULL;
return (block->next);
}
struct s_block *set_free_space(size_t size, struct s_block *block)
{
struct s_block new_block;
new_block = sbrk(sizeof(s_block));
new_block->start = block->start;
new_block->next = NULL;
new_block->size = size;
new_block->end = ???; // this is where I want to split the first sbrk
// I tried new_block->end = new_block->start + size; but it doesn't work either
block->start = new_block->end + 1; // and i set the new start of the big block at the end of the one i use
return (new_block);
}
如果我理解你的问题,你似乎想做一个大sbrk()
,然后每次你 malloc 时拆分一个新部分。
由于 sbrk 对你的程序承担了负载,这个想法很好,但似乎你误解了 malloc 的一些东西。
Malloc 在其最简单的实现中分配了一定数量的空间,如下所示:
struct metadata
{
size_t size;
int free;
struct metadata *next;
void *data;
}
数据是指向分配区域的第二部分的指针,包含实际空间。接下来是指向分配区域末尾的指针。
malloc
某个空间时,将创建此结构并返回数据指针。然后,要释放,您只需将"free"值设置为 1。
这将生成一个链表,其中包含您的所有数据,并且所有数据都在您的 sbrk'd 区域中。
有关不同 malloc 实现的更多信息,请参阅此答案它使用mmap,但也可以使用sbrk