gpt4 book ai didi

c - 将 sbrk 分成 2 个

转载 作者:行者123 更新时间:2023-11-30 16:50:55 32 4
gpt4 key购买 nike

为了重新编码 malloc 函数,我执行了 sbrk(stack) 其中:

void *malloc(size_t size)
{
stack = 0;
while (stack < size)
stack += 4096;
}

我 malloc 总是比我需要的多,然后我想获取一些大小为 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;
}

这是我的结构。然后我有一个创建 block 的函数

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(),然后每次分配时分割一个新的部分。

这个想法很好,因为 sbrk 对您的程序承担了负载,但您似乎误解了有关 malloc 的内容。

Malloc 在其最简单的实现中分配一定量的空间,如下所示:

struct metadata
{
size_t size;
int free;
struct metadata *next;
void *data;
}

data 是指向已分配区域第二部分的指针,包含实际空间。next 是指向分配区域末尾的指针。

当您malloc某个空间时,您将创建此结构并返回数据指针。然后,要释放,您只需返回将“free”值设置为 1。

这会生成一个链接列表,其中包含您的所有数据以及您的 sbrk 区域中的所有数据。

有关不同 malloc 实现的更多信息,请参阅 this answer它使用 mmap 但也可以使用 sbrk

关于c - 将 sbrk 分成 2 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41980791/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com