手动为结构分配内存

时间:2014-04-08 17:55:37

标签: c memory memory-management struct

所以我在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错误。它是否需要是一个指针,以便我们可以设置它的地址,然后设置值?

3 个答案:

答案 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必须是指针

不需要演员

包含适当的标题