标题:为什么这个内存分配的程序不能运行
取消只看楼主
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
结帖率:66.67%
 问题点数:0 回复次数:0 
为什么这个内存分配的程序不能运行

程序为什么调试的没错,但是不能运行。。。。初始化得问题么???
#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;
}
}
搜索更多相关主题的帖子: address include 
2012-11-20 11:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-387645-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016266 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved