注册 登录
编程论坛 数据结构与算法

malloc函数

senpujituan 发布于 2012-08-06 09:52, 2566 次点击
自编malloc函数,用单链表或双链表或循环链表实现内存分配、释放。没有思路,感觉还是得用数组申请空间吧。
16 回复
#2
senpujituan2012-08-06 17:01
现在有点思路了:1、用系统自带的malloc函数申请一个1000大小的空间   2、用系统自带的malloc函数申请一个链表结点  3、结构体里的内容为:是否可申请标志位、前一个的首地址、要申请的大小、指向下一个结点的指针。4、之后链表连起来。
感觉好像可以,但转换成c语言又感觉有点问题,希望高手解答!!!
#3
寒风中的细雨2012-08-06 21:02
最底层的是  数组+双循环链表的形式

array[0]<-->mem_block<-->...
array[1]<-->NULL
array[2]<-->NULL
   .
   .
   .
array[n]<-->mem_block<-->...
初始状态

#4
senpujituan2012-08-07 09:03
回复 3楼 寒风中的细雨
哎,我是新手,能写简单点吗??昨天又想了点:申请一个释放一个没问题,但是假如申请好几个,比如3个,这时,要释放到中间的那个,地址找不到了,怎么办??
#5
寒风中的细雨2012-08-07 14:46
不太容易写的
#6
寒风中的细雨2012-08-07 15:14
程序代码:
#define null ((void*)0)//空指针
#define MAX_SIZE    (3)//最大数组元素个数
#define MEM_SIZE    (1000)//可以分配的总的内存大小
#define PAGE_SIZE    (2<<3)//每‘页’的内存大小
#define PAGE_NUM    ((MEM_SIZE)/(PAGE_SIZE))//‘页’的数量

struct list
{
    struct list *next;
    struct list *prev;
};

struct mem_page//内存块大小
{
    void *addr_start;
    void *addr_end;
};

struct mem_block
{
    unsigned int flag;//表示数组下标值
    ...
    void *addr_start;
    void *addr_end;
    struct list node;
}

void *g_addr_start = null;//内存的起始地址
struct mem_page g_page_array[PAGE_NUM];//‘页’数组
struct list g_array[MAX_SIZE];//用于挂载内存的数组

/****   针对循环链表的操作  *****/
//初始化链表
__init_list(...){}
//向链表末尾插入结点
__list_insert(...){}
//向现表头插入节电
__list_header_insert(...){}
//删除末尾的结点
__list_del(...){}
//合并
__list_merge(...){}
//判断链表是否为空
__list_empty(...){}
//删除链表中的子链
__list_del_range(...){}
//在链表中添加子链
__list_insert_range(...){}
/***     end          *****/

//系统初始化
void __init(void)
{
    int i;

    g_addr_start = malloc (MEM_SIZE*sizeof(char));
    assert(null != g_addr_start);
   
    //初始化‘页’数组
   
//for (i=0; i<PAGE_NUM; ++i)
   
//{
   
//    g_page_array[i].addr_start = (void*)((unsigned int)g_addr_start + (i * PAGE_SIZE));
   
//    g_page_array[i].addr_end = (void*)((unsigned int)g_addr_start + ((i+1) * PAGE_SIZE - 1));
   
//}

   
//初始化g_array
    ...

    //把‘页’组成内存块挂到g_list上
   
//先 在g_array[MAX_SIZE-1] 双循环中挂,
   
//剩下的不能放到g_array[MAX_SIZE-1]中的
   
//全部 挂到g_array[0]上
    ...
}

/**

 * 申请空间

 * size 大小

 * 成功返回首地址, 失败返回null

 
*/
void *r_malloc(unsigned int size){}//伙伴算法 从g_array中  搜索满足最小的下标值
/*
*

 * 释放

 * addr 释放的首地址

 
*/
void r_free(void *addr){}//把内存块归还到对应的g_array下标的双循环链表中  然后检索  看是否能合并

int main(void)
{
    __init();

    exit(0);
}
这里分配的最小的大小为一个‘页’   如果还要更细的资源管理 需要在上面加一层
#7
Vitens2012-08-08 09:48
不错,值得学习
#8
senpujituan2012-08-09 10:22
回复 6楼 寒风中的细雨
谢谢!!先简单的写出来再说!!
#9
寒风中的细雨2012-08-09 10:45
晚上试着写了一个, 可以参考下
————————————————
只有本站会员才能查看附件,请 登录
#10
hao021719902012-08-11 16:05
不错,值得学习
#11
senpujituan2012-08-23 19:30
回复 9楼 寒风中的细雨
谢谢,搞出了一些。版主,问你个问题:我在局域网下建了个论坛,但是同局域网下的人,不能进去,我能进他们建的。方法都一样的,知道是什么原因吗?
#12
寒风中的细雨2012-08-23 20:18
相互访问吗?     在同一个网段    能ip可以ping通   看看防火墙的设置    一般都可以解决
#13
senpujituan2012-08-24 10:59
回复 12楼 寒风中的细雨
谢了,防火墙关了,开了个协议,就可以了。但是,防火墙关掉不是有危险??
#14
senpujituan2012-08-24 11:11
回复 13楼 senpujituan
谢谢啊。解决了,防火墙开着也能解决了。
#15
寒风中的细雨2012-08-25 08:34
回复 14楼 senpujituan
!!!
#16
netlin2012-08-26 11:13
学习了!
不过,有一个疑问:
malloc函数用于动态空间的申请,有什么不足不处吗?
自编malloc函数,新增加了什么性能?

作为练习,还是很好的一个材料。
#17
寒风中的细雨2012-08-26 11:55
回复 16楼 netlin
准备回答你的问题  但是看看帖子还是算了
1