malloc函数详解之自己用C语言写出实现malloc()和free()功能的函数

改进版传送: (空间复杂度比较低的版本)

---------------------------------------------------------------------------------------------

malloc()函数使用来动态分配内存空间,free()用来释放内存空间,两者搭配使用,若忘记free,则可能引起内存泄漏。

为什么要自己编写malloc()函数:在嵌入式编程中,内存的大小都是有限的,考虑到成本问题,我们尽量包含少一点的函数库,减小不必要的浪费。

malloc函数实现的原理:

C语言实现过程:

首先是定义一块区域:

char memory[2000];                             //模拟一个堆空间

定义一个区块的结构体:

struct block{  
    size_t size;                  //区块大小  
    int free;                     //是否已使用  
    struct block *next;           //指向下一个区块  
};

对模拟空间进行初始化:

void initialize()  
{  
    struct block *freeList = (void *)memory;                 
    freeList->size=2000-sizeof(struct block);              //可用空间大小  
    freeList->free=1;                                      //1:空闲 0:使用  
    freeList->next=NULL;                                   //指向空  
}

MyMalloc()函数编写:

void *MyMalloc(size_t noOfBytes)
{
    struct block *curr,*prev;
    void *result;
    if(!(freeList->size))
    {
        initialize();
    }
    curr=freeList;
    while((((curr->size)<noOfBytes)||((curr->free)==0))&&(curr->next!=NULL))
    {
        prev=curr;
        curr=curr->next;
    }
    if((curr->size)==noOfBytes)
    {
        curr->free=0;
        result=(void*)(++curr);
        return result;
    }
    else if((curr->size)>(noOfBytes+sizeof(struct block)))            //所需要的内存大小小于区块大小
    {
        split(curr,noOfBytes);                                        //分割区块函数
        result=(void*)(++curr);                                       //使用的位置
        return result;
    }
    else
    {
        result=NULL;
        return result;
    }
}

split()函数实现:

void split(struct block *fitting_slot,size_t size)
{
    struct block *new=(void*)((void*)fitting_slot+size+sizeof(struct block));   //定义new的地址
    new->size=(fitting_slot->size)-size-sizeof(struct block);                   //定义size大小
    new->free=1;                                                                //设置是否工作
    new->next=fitting_slot->next;                                               //独立出去,形成新的块
    fitting_slot->size=size;
    fitting_slot->free=0;
    fitting_slot->next=new;
}

Myfree()函数:

void merge()
{
    struct block *curr,*prev;
    curr=freeList;
    while((curr->next)!=NULL)
    {
        if((curr->free) && (curr->next->free))
        {
            curr->size += (curr->next->size)+sizeof(struct block);
            curr->next = curr->next->next;
        }
        prev=curr;
        curr=curr->next;
     }
}

void MyFree(void* ptr)
{
    if(((void*)memory<=ptr)&&(ptr<=(void*)(memory+2000)))
    {
        struct block* curr=ptr;
        --curr;
        curr->free=1;
        merge();
     }
    else
        return;
}


 

  • 12
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值