为什么这个内存分配的程序不能运行
程序为什么调试的没错,但是不能运行。。。。初始化得问题么???
#include<stdio.h>
#define N 20//最大作业数量为N
#define M 20//空闲区表最大为M
#define minsize 1 //最小
struct
{
float address;//已分配区的起始地址
float length;//长度
int flag;//标志 0为空区 1为已存储
}used[N];
struct
{
float address;//未分配区的起始地址
float length;//长度
int flag;//标志 0为空区 1为未分配
}free[M];
void csh()//初始化
{
int i,a;
int name;
printf("请输入已分配的作业数:\n");
scanf("%d",&a);
for(i=0;i<a;i++)
{
printf("请输入已分配作业名:\n");
scanf("%d",&name);
printf("请输入该作业起始地址:\n");
scanf("%f",&used[i].address);
printf("请输入该作业大小:\n");
scanf("%f",&used[i].length);
printf("请输入该作业的状态:\n");//0为空闲区,1为已分配
scanf("%d",&used[i].flag);
}
free[0].address=10;
free[0].length=10;
free[0].flag=1;
for(i=1;i<M;i++)
free[i].flag=0;
}
void fenpei(int name,float size)//分配内存
{
int i=0,k=-1;
int count=0;
float ad,l;
printf("请输入你要分配的作业名:\n");
scanf("%d",&name);
printf("请输入你要分配的作业所需空间的大小:\n");
scanf("%f",&size);
while(i<=M-1)
{
if(free[i].flag==1 && size<=free[i].length)
{
count++;
if(count==1||free[i].length<free[k].length)
k=i;
}
i++;
}
if(k!=-1)
{
if(free[k].length-size<=minsize)
{
free[k].flag=0;
ad=free[k].address;
l=free[k].length;
}
else
{
ad=free[k].address;
l=free[k].length;
free[k].address=free[k].address+l;
free[k].length=free[k].length-l;
}
while(used[i].flag!=0)
{
i++;
}
if(i<=N-1)
{
used[i].address=ad;
used[i].length=l;
used[i].flag=name;
count++;
}
else
{
if(free[k].flag==0)
{
free[k].address=ad;
free[k].length=l;
free[k].flag=1;
}
else
{
free[k].address=ad;
free[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;
printf("请输入你要回收的作业名:\n");
scanf("%d",&name);
for(i=0;i<N;i++)
if(used[i].flag==name)
{
used[i].flag=0;
rad=used[i].address;
rl=used[i].length;
}
else
printf("未找到该作业!!!");
while(!(n>=M||(k!=-1&&n!=-1)))
{
if(free[j].flag==1)
{
if(free[j].address+free[j].length==rad)
k=j;
if(rad+rl==free[j].address)
n=j;
}
j=j+1;
}
if(k!=-1)//有上邻接区
{
if(n!=-1)//有下邻接区
{
free[k].length+=free[n].length+rl;
free[n].flag=0;
}
else
free[k].length+=rl;
}
else if(n!=-1)
{
free[n].length+=rl;
free[n].address=rad;
}
else//既没有上邻接区也没有下邻接区
{
while(free[y].flag!=0)
{ y++;}
if(y<=M-1)
{
free[y].address=rad;
free[y].length=rl;
free[y].flag=1;
}
else
{
used[y].flag=name;
printf("空闲区已经满了!!!!回收失败!!!!");
}
}
}
void show(int name)
{int i;
printf("\t\t分配区表");
printf("|作业名| |起始地址| |内存大小| |状态|");
for(i=0;i<N;i++)
{printf("%d %f %f %d\n",&name,&used[i].address,used[i].length,used[i].flag);}
}
void main()
{int choice;
int name;
float size;
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("您的输入有误");
csh();
switch(choice)
{
case 1:fenpei(name,size);break;
case 2:huishou(name);break;
case 3:show(name);break;
case 4:break;
default:;break;
}
}