malloc函数
自编malloc函数,用单链表或双链表或循环链表实现内存分配、释放。没有思路,感觉还是得用数组申请空间吧。
2012-08-06 09:52
2012-08-06 17:01
2012-08-06 21:02
2012-08-07 09:03
2012-08-07 14:46
程序代码:#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
2012-08-08 09:48
2012-08-09 10:22
2012-08-09 10:45
2012-08-11 16:05