首页 文章

手动为结构分配内存

提问于
浏览
3

所以我正在研究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 回答

  • 0

    您可以在 FList_elem 结构中嵌入整个 block_header 结构,而不是在 FList_elem 结构中存储指向 block_header 的原始代码:

    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 字节的其余部分一起使用 .

    要设置大小字段(以及可能添加到块 Headers 中的任何其他属性),您可以执行以下操作:

    freeBlock->header.size = newsize;
    
  • 0

    在分配请求的大小时,您需要添加 Headers 元素 - 以及指向下一个块的指针(最终 - 可以使用指针差异计算大小作为空间优化...如果这是嵌入式人员,则每个块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
    }
    

    函数的调用者将返回 Headers 后的空格 .

    你的 manual_free() 函数将把这个返回的内存指针作为一个参数,它需要在内存中减去并返回 freeblock 才能找到 Headers 并释放块,而且你需要某种树(位树)保持跟踪空洞的自由...如果你需要处理动态内存 - 这就是它开始变得有趣的地方 .

    希望我没有做错,而且它已经足够清楚了!

  • -3
    #include <stdlib.h>
    struct st *x = malloc(sizeof *x);
    

    注意:

    x必须是指针

    不需要演员表

    包括适当的 Headers

相关问题