所以我正在研究C中的一个项目,我们需要实现malloc和free(意思是,我们不能使用任何C内存管理函数,如malloc()或free()) . 这只是一个代码段,但它包含所有相关部分 .
struct block_header
{
int size;
};
typedef struct FList_elem
{
struct block_header * header;
struct list_elem elem;
} FLelem;
void * manual_malloc(size_t size)
{
freeBlock = (FLelem *) mem_sbrk(newsize);
freeBlock->header = (struct block_header *) freeBlock;
freeBlock->header->size = newsize;
}
在分配新的“块”内存时,我们通过结构FList_elem来表示它 . 为了为结构“分配内存”,我们将其指向mem_sbrk返回的内存地址(就像sbrk()一样工作) . 我的问题是,我们如何为大小变量 Build 内存?最初它的地址是0x0,因此对它的赋值或引用会导致seg错误 . 它需要是一个指针,以便我们可以设置它的地址,然后是值吗?
3 回答
您可以在
FList_elem
结构中嵌入整个block_header
结构,而不是在FList_elem
结构中存储指向block_header
的原始代码:通过这种方式,您不需要单独分配
block_header
:它与FList_elem
字节的其余部分一起使用 .要设置大小字段(以及可能添加到块 Headers 中的任何其他属性),您可以执行以下操作:
在分配请求的大小时,您需要添加 Headers 元素 - 以及指向下一个块的指针(最终 - 可以使用指针差异计算大小作为空间优化...如果这是嵌入式人员,则每个块4个字节保存) .
由于我认为有一些不一致,我在这里报告了我对你要做的事情的解释(未经测试):
函数的调用者将返回 Headers 后的空格 .
你的
manual_free()
函数将把这个返回的内存指针作为一个参数,它需要在内存中减去并返回freeblock
才能找到 Headers 并释放块,而且你需要某种树(位树)保持跟踪空洞的自由...如果你需要处理动态内存 - 这就是它开始变得有趣的地方 .希望我没有做错,而且它已经足够清楚了!
注意:
x必须是指针
不需要演员表
包括适当的 Headers