C语言内存分配算法之一

目录

1、整体构思:

  1.1 核心思想:

  1.2 图解:

  1.3 结构体:

2、内存初始化

3、分配内存

4、删除内存

5、主函数结果


1、整体构思:

  1.1 核心思想:

                 每个任务块由链表节点和内存区域构成

        

  1.2 图解:

 

C语言内存分配算法之一

 

  1.3 结构体:

    //---------------------------------------------
    //  内存块链表
    //---------------------------------------------
    typedef struct _MEMADDR_
    {
        u32   len       :     31; // 当前内存块的长度
        u32   status    :     1 ; // 是否被使用
        struct _MEMADDR_*  plast; // 指向上个内存块的地址
        struct _MEMADDR_*  pnext; // 指向下个内存块的地址
    }MEMADDR;

    typedef enum _MEMSTATUS_
    {
        USED, // 使用
        FREE = !USED, // 空闲
    }MEMSTATUS;

2、内存初始化

u32 mem[MEMLEN] = { 0x0 };   // 申请一块连续地址作为内存分配

MEMADDR * memphead = NULL; // 内存链表头

void MEMInit(void) // 内存初始化
{
    memphead = (MEMADDR*)mem;   // 指向数组头
    
    memphead->len    = MEMLEN - 3;
    memphead->status = FREE;
    memphead->plast  = memphead;
    memphead->pnext  = memphead;

}

3、分配内存

void* MEMAllo(u32 memlen) // 内存分配
{

    MEMADDR* mempnode = memphead; // 这个的功能主要是 用链表 寻找可用的 块
    MEMADDR* mempnew = NULL;     // 新内存块的地址

    u8* mem8pnew = NULL;
    u32 len_temp=0;

    while (1)
    {
        while (mempnode->status != FREE)
        {
            if (mempnode->pnext == memphead) // 如果查到最后一个节点都是USED,则退出
            {
                break;
            }
            mempnode = mempnode->pnext; //
        }
        if (mempnode->status == FREE) // 如果是因为空闲才退出的,进行内存分配
        {
            if (mempnode->len < memlen) // 如果该内存块长度不够
            {
                if (mempnode->pnext == memphead) // 如果已经是最后一块了
                    break;

                mempnode = mempnode->pnext;
                continue;
            }
            if (memlen >= (mempnode->len))
                return NULL;

            len_temp = mempnode->len; // 当前块空闲长度 以字节为单位
            // 
            mempnew = mempnode;

            mem8pnew = (u8*)mempnew + memlen + (3<<2); // 偏移
            mempnode = (MEMADDR*)mem8pnew;

            mempnode->pnext = mempnew->pnext;
            mempnode->plast = mempnew; 
            mempnew->pnext->plast = mempnode;
            mempnew->pnext = mempnode;

            mempnew->len    = memlen;
            mempnew->status = USED;

            mempnode->len = ((len_temp << 2) - memlen - (3<<2));

            mempnode->status = FREE;

            return mempnew;
        }
        else
        {
            // 无空余内存
            return NULL; // 返回一个地址
        }
    }
}

4、删除内存

//-----------------------------
// 以字节为单位
//-----------------------------
u32 MEMFree(void* mempnode_del)
{
    MEMADDR* mempnode = (MEMADDR*)mempnode_del;
    MEMADDR* memplast = NULL;
    MEMADDR* mempnext = NULL;
    u32 ret = 0;

    mempnode->status = FREE;

    if (mempnode == memphead) // 当前是表头
    {
        if (mempnode->pnext->status != USED)
        {
            mempnext = mempnode->pnext;

            mempnext->pnext->plast = mempnode;
            mempnode->pnext = mempnext->pnext;

            mempnode->status = FREE;
            mempnode->len += mempnext->len + 12; // 加上一个12字节的指针

            ret |= bit0;
        }
    }
    else // 非表头
    {

        if (mempnode->pnext->status != USED) // 下一个未使用
        {
            mempnext = mempnode->pnext;

            mempnext->pnext->plast = mempnode;
            mempnode->pnext = mempnext->pnext;

            mempnode->status = FREE;
            mempnode->len += mempnext->len + 12; // 加上一个12字节的指针

            ret |= bit1;
        }
        if (mempnode->plast->status != USED) // 上一个未使用
        {
            memplast = mempnode->plast;

            mempnode->pnext->plast = memplast;
            memplast->pnext = mempnode->pnext;

            memplast->status = FREE;
            memplast->len += mempnode->len + 12;

            ret |= bit2;
        }
        
    }

    mempnode = NULL;
    mempnext = NULL;
    memplast = NULL;

    return ret;
}

5、主函数结果

C语言内存分配算法之一

 

请尊重个人劳动成果,转载请注明出处并艾特我,谢谢!

源码下载: //download.****.net/download/aeegyjfe/12060150