C语言实现用程序数据段空间模拟内存的动态分配

遇到一个项目情况比较特别,可能是一个嵌入式的系统吧,居然不支持动态分配,还只能用标准C,琢磨了好几天,最后还是自己写了套函数,模拟一下动态分配。

大致是这样想的,弄个全局的buffer,在buffer里做alloc和free操作,局限性当然是buffer的大小不宜太大,尤其是16bit的环境。

如果对buffer的大小有要求,可通过修改源代码中的预定义来实现。
MAX_ARRAY_SIZE 最多可分配的内存块数的量。
MAX_POOL_SIZE  最多可分配的字节数,也就是预留的buffer大小。
struct BM_ARRAY_NODE 描述未分配和已分配的区块。


源代码:bm_malloc.h (version 1.0)
#pragma  once

void    uimalloc_init( void );
void   *  ui_malloc(unsigned  short  size);
void    ui_mfree( void   * p);

源代码:bm_malloc.c (version 1.0)
#include  < memory.h >
#include 
< string .h >
#include 
< assert.h >
#include 
" bm_malloc.h "

#define  MAX_ARRAY_SIZE  256
#define  MAX_POOL_SIZE    0xFFFF

typedef 
struct  BM_ARRAY_NODE
{
    unsigned 
short index;
    unsigned 
short len;
}
 BM_ARRAY_NODE;

static  BM_ARRAY_NODE g_BM_FreeBlockList[MAX_ARRAY_SIZE  +   1 =   { 0} ;
static  BM_ARRAY_NODE g_BM_UsedBlockList[MAX_ARRAY_SIZE  +   1 =   { 0} ;
static  unsigned  char  g_BM_Buffer[MAX_POOL_SIZE];

/*
 *    insert a new node into ary_list, order by BM_ARRAY_NODE.index
 *    
 *    return value: the index of new node in array. return -1 if error.
 
*/

int  bm_array_add(BM_ARRAY_NODE  * ary_list,  const  BM_ARRAY_NODE node)
{
    assert(ary_list);
    unsigned 
short i; /*loop*/
    unsigned 
short n = ary_list[MAX_ARRAY_SIZE].index; /*item count in the ary_list*/
    unsigned 
short pos = n; /*insert position. assume insert at the end of array*/
    unsigned mov_len; 
/*moved data length in byte*/

    assert(n 
< MAX_ARRAY_SIZE);

    
/*search the fixed position in order*/
    
for (i=0; i<n; i++)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值