一个内存分配回收的程序 为什么不能分配内存啊 求人相助啊
#include<stdio.h>
#define N 10//最大作业数量为N
#define M 10//空闲区表最大为M
#define minsize 3 //最小
typedef struct
{
float address;//已分配区的起始地址
float length;//长度
int flag;//标志 0为空区 1为已存储
}used;
used ut[N];
typedef
struct
{
float address;//未分配区的起始地址
float length;//长度
int flag;//标志 0为空区 1为未分配
}free;
free ft[M];
void csh()//初始化
{ int i;
ft[0].address=10;
ft[0].length=10;
ft[0].flag=1;
for(i=1;i<M;i++)
ft[i].flag=0;
for(i=1;i<M;i++)
ut[i].flag =0;
}
void fenpei(int name,float size)//分配内存
{
int i=0,j=0,k=-1;
int count=0;
float ad,l;
while(i<=M-1)
{
if(ft[i].flag==1 && size<=ft[i].length)
{
count++;
if(count==1||ft[i].length<ft[k].length)
k=i;
}
i++;
}
if(k!=-1)
{
if(ft[k].length-size<=minsize)
{
ft[k].flag=0;
ad=ft[k].address;
l=ft[k].length;
}
else
{
ad=ft[k].address;
l=ft[k].length;
ft[k].address=ft[k].address+l;
ft[k].length=ft[k].length-l;
}
while(ut[j].flag!=0)
{
j++;
}
if(j<=N-1)
{
ut[j].address=ad;
ut[j].length=l;
ut[j].flag=name;
count++;
}
else
{
if(ft[k].flag==0)
{
ft[k].address=ad;
ft[k].length=l;
ft[k].flag=1;
}
else
{
ft[k].address=ad;
ft[k].length+=l;
}
printf("内存的分配区已满,不能分配!!");
}
}
else
{
printf("找不到合适的分配大小");
}
}
void huishou(int name)//回收内存
{
int i,j=0;
int k=-1;int n=-1;
int y=0;
float rad,rl;
for(i=0;i<N;i++)
if(ut[i].flag==name)
{
ut[i].flag=0;
rad=ut[i].address;
rl=ut[i].length;
}
else
printf("未找到该作业!!!");
while(!(n>=M||(k!=-1&&n!=-1)))
{
if(ft[j].flag==1)
{
if(ft[j].address+ft[j].length==rad)
k=j;
if(rad+rl==ft[j].address)
n=j;
}
j=j+1;
}
if(k!=-1)//有上邻接区
{
if(n!=-1)//有下邻接区
{
ft[k].length+=ft[n].length+rl;
ft[n].flag=0;
}
else
ft[k].length+=rl;
}
else if(n!=-1)
{
ft[n].length+=rl;
ft[n].address=rad;
}
else//既没有上邻接区也没有下邻接区
{
while(ft[y].flag!=0)
{ y++;}
if(y<=M-1)
{
ft[y].address=rad;
ft[y].length=rl;
ft[y].flag=1;
}
else
{
ut[y].flag=name;
printf("空闲区已经满了!!!!回收失败!!!!");
}
}
}
void show(int name)
{int i;
printf("\t\t分配区表\n");
printf("|作业名| |起始地址| |内存大小| |状态|\n");
for(i=0;i<N;i++)
{if(ut[i].flag!=0)
printf("%d %f %f %d\n",&name,&ut[i].address,ut[i].length,ut[i].flag);}
}
void main()
{int choice;
int name;
float size;
csh();
while(1)
{
printf("\t***********************************\n");
printf("\t\t1.分配\n");
printf("\t\t2.回收\n");
printf("\t\t3.显示分配情况\n");
printf("\t\t4.退出\n");
printf("\t***********************************\n");
printf("请输入选择1-4:");
scanf("%d",&choice);
if(choice<1||choice>4)
printf("您的输入有误");
switch(choice)
{
case 1:
printf("请输入你要分配的作业名:\n");
scanf("%d",&name);
printf("请输入你要分配的作业所需空间的大小:\n");
scanf("%f",&size);fenpei(name,size);
getch();
system("cls");
break;
case 2:printf("请输入你要回收的作业名:\n");
scanf("%d",&name);
huishou(name);
getch();
system("cls");break;
case 3:show(name);
getch();
system("cls");break;
case 4:break;
default:;break;
}
}}
[ 本帖最后由 屎宝宝 于 2012-11-20 15:58 编辑 ]