动态内存分配简单实现

#include <stdio.h>
#include <stdlib.h>
#include <string>

#define n 10
#define m 10
#define minisize 100
using namespace std;                  //要使用STRING 类型等等就要加这个,不然使用前都要加上std::
struct{ 
    int address;
    int length;
    char  jobname;
    int flag;
    

}used_table[n];
struct{
    int address;
    int length;

    int flag;
    

}free_table[m];

void allocate(char j,int x)          //分配内存函数
{
     int mostsuit=-1;
	int leng=10241;       //这个变量用来辅助寻找最适合也就是长度最接近任务的空闲区域   
	for(int i=0;i<m;i++)        //遍历空闲表 ,找到最适合的并标记
	{
	if(free_table[i].flag==1)
	if(free_table[i].length==x)
	{
		free_table[i].flag=0;
		mostsuit=i;
		break;
	}
	else if(free_table[i].length>x&&free_table[i].length<leng)
	{
		leng=free_table[i].length;
		mostsuit=i;
	}
	}
	if(mostsuit!=-1)        //如果找到,就改变这个空闲表的使用标记,并更改使用表
	{
			for(int t=0;t<n;t++)       
		{
			if(used_table[t].flag==0)
			{	used_table[t].flag=1;
				used_table[t].address=free_table[mostsuit].address;
				used_table[t].length=x;
				//printf("%d \n",x);
				used_table[t].jobname=j;
				break;
			}
			
			
		}
			free_table[mostsuit].address+=x;
			free_table[mostsuit].length-=x;

	}else 
	{
		printf("对不起没有足够的内存执行您的操作");
	}

}
void  reclaim(char j)
{
		//printf("ssssss"); 
		for(int i=0;i<m;i++)                         //遍历使用表,找到对应任务,然后更改使用标记,并更改空闲表
		{
		  if(used_table[i].jobname==j&&used_table[i].flag==1)
			{
				
				used_table[i].flag=0;
				for(int t=0;t<m;t++)
				{
					if(free_table[t].flag==0)
					{
					      free_table[t].flag=1;
					      free_table[t].address=used_table[i].address;
					      free_table[t].length=used_table[i].length;
						
						break;
					}
				}
				break;
			}
		}
		for(int i=0;i<m;i++)    //对更改后的空闲表进行拼接。
		{
			if(free_table[i].flag==1)
			for(int t=0;t<m;t++)
			{
				if((free_table[i].address+free_table[i].length)==free_table[t].address&&free_table[t].flag==1)
				{
					   free_table[i].flag=0;
					   free_table[t].address=free_table[i].address;
					   free_table[t].length=free_table[i].length+free_table[t].length;
					   break;
				}
			}
		}	
			
		
}
 
int main()
{
    free_table[0].address=1024;
	    free_table[0].length=10240;
		free_table[0].flag=1;
			for(int i=1;i<m;i++)	{
				free_table[i].flag=0;
					}

			for(int i=0;i<m;i++)	{
				used_table[i].flag=0;
					}
			srand((int)time(0));//初始化随机函数
                       		while(1)
			{
				printf("内存使用情况:\n");
				for(int i=0;i<m;i++)
				{
				if(free_table[i].flag==1)
				{
				printf("第%d号空闲内存使用情况:起始地址:%d 可用长度:%d\n",i,free_table[i].address,free_table[i].length);
				}
				if(used_table[i].flag==1)
				{
				printf("第%d内存使用情况:起始地址:%d 作业长度:%d作业名称:%c\n ",i,used_table[i].address,used_table[i].length,used_table[i].jobname);
				}
				}
				char c;
				scanf("%c",&c);
				if(c=='c')
				{
					printf("请输入要删除的作业名称\n");
					char sa;
					getchar();
					scanf("%c",&sa);
					reclaim(sa);
					
				}
				else if(c=='n')
				{

				printf("请输入作业名称和长度:");
				int xx;
				char cc;
				getchar();
				scanf("%c %d",&cc,&xx);	
				allocate(cc,xx);		
				}

				getchar();  //吸收回车符,避免被SCANF吃掉


			}














}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值