malloc函数
自编malloc函数,用单链表或双链表或循环链表实现内存分配、释放。没有思路,感觉还是得用数组申请空间吧。
#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); }这里分配的最小的大小为一个‘页’ 如果还要更细的资源管理 需要在上面加一层