没有合适的资源?快使用搜索试试~ 我知道了~
数据结构目录法实现malloc
需积分: 9 4 下载量 75 浏览量
2012-09-01
20:14:01
上传
评论
收藏 4KB TXT 举报
温馨提示
试读
7页
数据结构目录法实现malloc,只有代码。
资源推荐
资源详情
资源评论
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MEM_SIZE 10000 //总内存大小,包括可分配空间和目录
#define TAB_NUM 100 //目录项的数目
#define ARR_LENGTH 102 //测试用,数组长度
char start[MEM_SIZE];//用于malloc的内存空间,大小为10000字节;其中10000-12*100=8800字节用于分配内存,余下的为100个目录项;
typedef struct mblock{
void *addr; //指向一个内存块的首地址;
size_t size;//该内存块的大小
int tag;//标志0为空闲,1表示已分配
}Block;//目录项的类型,大小为4+4+4=12字节;
Block *blockTab;//全局指针变量,指向第一个目录项(在函数init_mem中初始化)
void init_mem(Block **blockTab); //初始化工作
void *m_malloc(size_t size); //malloc
void m_free(void *ptr); //free
void init_mem(Block **blocktab)
{
*blocktab=(Block *)(start+(MEM_SIZE-TAB_NUM*sizeof(Block)));
(*blocktab)->addr=start;
(*blocktab)->size=MEM_SIZE-TAB_NUM*sizeof(Block);
(*blocktab)->tag=0;
}
void *m_malloc(size_t size)
{
int i;
void *p=NULL;
Block *temp=NULL;
for(i=0;i<TAB_NUM;i++)
#include<stdio.h>
#include<string.h>
#define MEM_SIZE 10000 //总内存大小,包括可分配空间和目录
#define TAB_NUM 100 //目录项的数目
#define ARR_LENGTH 102 //测试用,数组长度
char start[MEM_SIZE];//用于malloc的内存空间,大小为10000字节;其中10000-12*100=8800字节用于分配内存,余下的为100个目录项;
typedef struct mblock{
void *addr; //指向一个内存块的首地址;
size_t size;//该内存块的大小
int tag;//标志0为空闲,1表示已分配
}Block;//目录项的类型,大小为4+4+4=12字节;
Block *blockTab;//全局指针变量,指向第一个目录项(在函数init_mem中初始化)
void init_mem(Block **blockTab); //初始化工作
void *m_malloc(size_t size); //malloc
void m_free(void *ptr); //free
void init_mem(Block **blocktab)
{
*blocktab=(Block *)(start+(MEM_SIZE-TAB_NUM*sizeof(Block)));
(*blocktab)->addr=start;
(*blocktab)->size=MEM_SIZE-TAB_NUM*sizeof(Block);
(*blocktab)->tag=0;
}
void *m_malloc(size_t size)
{
int i;
void *p=NULL;
Block *temp=NULL;
for(i=0;i<TAB_NUM;i++)
{
if((blockTab+i)->addr==NULL)
continue;
if((blockTab+i)->tag==0)
{
if(temp==NULL&&(blockTab+i)->size>=size)
{
temp=blockTab+i;
}
else if((blockTab+i)->size>=size&&temp->size>(blockTab+i)->size)
temp=blockTab+i;
}
}
if(temp==NULL)
return p;
for(i=0;i<TAB_NUM;i++)
{
if((blockTab+i)->addr==NULL)
{
if(temp->size==size)
{
temp->tag=1;
p=temp->addr;
return p;
}
else if(temp->size>size)
{
(blockTab+i)->addr=(char*)(temp->addr)+size;
(blockTab+i)->size=temp->size-size;
(blockTab+i)->tag=0;
if((blockTab+i)->addr==NULL)
continue;
if((blockTab+i)->tag==0)
{
if(temp==NULL&&(blockTab+i)->size>=size)
{
temp=blockTab+i;
}
else if((blockTab+i)->size>=size&&temp->size>(blockTab+i)->size)
temp=blockTab+i;
}
}
if(temp==NULL)
return p;
for(i=0;i<TAB_NUM;i++)
{
if((blockTab+i)->addr==NULL)
{
if(temp->size==size)
{
temp->tag=1;
p=temp->addr;
return p;
}
else if(temp->size>size)
{
(blockTab+i)->addr=(char*)(temp->addr)+size;
(blockTab+i)->size=temp->size-size;
(blockTab+i)->tag=0;
剩余6页未读,继续阅读
资源评论
zhengxiangyun123
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功