#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吃掉
}
}
动态内存分配简单实现
最新推荐文章于 2021-12-07 13:42:21 发布