| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2566 人关注过本帖
标题:malloc函数
只看楼主 加入收藏
senpujituan
Rank: 4
等 级:业余侠客
帖 子:91
专家分:203
注 册:2012-6-29
结帖率:100%
收藏
 问题点数:0 回复次数:16 
malloc函数
自编malloc函数,用单链表或双链表或循环链表实现内存分配、释放。没有思路,感觉还是得用数组申请空间吧。
搜索更多相关主题的帖子: 内存 空间 
2012-08-06 09:52
senpujituan
Rank: 4
等 级:业余侠客
帖 子:91
专家分:203
注 册:2012-6-29
收藏
得分:0 
现在有点思路了:1、用系统自带的malloc函数申请一个1000大小的空间   2、用系统自带的malloc函数申请一个链表结点  3、结构体里的内容为:是否可申请标志位、前一个的首地址、要申请的大小、指向下一个结点的指针。4、之后链表连起来。
感觉好像可以,但转换成c语言又感觉有点问题,希望高手解答!!!
2012-08-06 17:01
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
最底层的是  数组+双循环链表的形式

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

2012-08-06 21:02
senpujituan
Rank: 4
等 级:业余侠客
帖 子:91
专家分:203
注 册:2012-6-29
收藏
得分:0 
回复 3楼 寒风中的细雨
哎,我是新手,能写简单点吗??昨天又想了点:申请一个释放一个没问题,但是假如申请好几个,比如3个,这时,要释放到中间的那个,地址找不到了,怎么办??
2012-08-07 09:03
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
不太容易写的
2012-08-07 14:46
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#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);
}
这里分配的最小的大小为一个‘页’   如果还要更细的资源管理 需要在上面加一层
2012-08-07 15:14
Vitens
Rank: 2
等 级:论坛游民
帖 子:38
专家分:47
注 册:2012-7-27
收藏
得分:0 
不错,值得学习
2012-08-08 09:48
senpujituan
Rank: 4
等 级:业余侠客
帖 子:91
专家分:203
注 册:2012-6-29
收藏
得分:0 
回复 6楼 寒风中的细雨
谢谢!!先简单的写出来再说!!
2012-08-09 10:22
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
晚上试着写了一个, 可以参考下
————————————————
malloc.zip (4.66 KB)
2012-08-09 10:45
hao02171990
Rank: 2
等 级:论坛游民
帖 子:17
专家分:17
注 册:2012-6-20
收藏
得分:0 
不错,值得学习
2012-08-11 16:05
快速回复:malloc函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044225 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved