所以我在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来表示它。为了"分配内存"对于struct,我们将它指向mem_sbrk返回的内存地址(就像sbrk()一样工作)。我的问题是,我们如何为大小变量建立内存?最初它的地址是0x0,因此对它的赋值或引用会导致seg错误。它是否需要是一个指针,以便我们可以设置它的地址,然后设置值?
答案 0 :(得分:0)
您可以在block_header
结构中嵌入整个FList_elem
结构,而不是将指针存储到block_header
结构中的原始代码。 {1}}结构:
FList_elem
通过这种方式,您无需单独分配struct block_header
{
int size;
};
typedef struct FList_elem
{
/* OLD code: struct block_header * header; */
/* Better code: block_header is embedded inside FList_elem structure */
struct block_header header;
struct list_elem elem;
} FLelem;
:它只是剩余的block_header
个字节。
要设置大小字段(以及可能添加到块标题中的任何其他属性),您可以这样做:
FList_elem
答案 1 :(得分:0)
在分配请求的大小时,需要添加标题元素 - 以及指向下一个块的指针(最终 - 可以使用指针差异计算大小作为空间优化...如果这是嵌入式人员,则为4每个块保存的字节数)。
由于我认为存在一些不一致之处,我在此报告了我对您要做的事情的解释(未经测试):
struct block_header
{
int size;
};
typedef struct FList_elem
{
struct block_header header; // removed a * here: size is in place
struct Flist_elem *elem; // added a * here: that's the pointer to the next block.
} FLelem;
FLelem *memory_list = 0; // added a pointer for the global list - right?
void * manual_malloc(size_t newsize) // renamed as newsize here
{
freeBlock = (FLelem *) mem_sbrk(newsize + sizeof(FLelem));
freeBlock->header.size = newsize;
freeBlock->header.elem = memory_list;
memory_list = freeBlock;
// inserted freeBlock at the head of memory_list;
return (void*)(freeBlock+1); // +1 to skip the header as a return address
}
该函数的调用者将在标题后返回空格。
你的manual_free()
函数将把这个返回的内存指针作为参数,它需要在内存中减去并返回freeblock
以找到标题并释放块,比你需要某种树(位树)来保持自由洞的轨道......如果你需要处理动态记忆 - 这就是它开始变得有趣的地方。
希望我没有做错,而且它已经足够清楚了!
答案 2 :(得分:-3)
#include <stdlib.h>
struct st *x = malloc(sizeof *x);
请注意:
x必须是指针
不需要演员
包含适当的标题