| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 515 人关注过本帖
标题:一个内存分配回收的程序 为什么不能分配内存啊 求人相助啊
只看楼主 加入收藏
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:8 
一个内存分配回收的程序 为什么不能分配内存啊 求人相助啊

#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 编辑 ]
搜索更多相关主题的帖子: address include 
2012-11-20 11:09
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:7 
LZ  名字 怎么想到的
2012-11-20 13:08
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
收藏
得分:0 
哈哈 好玩么。。。
收到的鲜花
  • 寒风中的细雨2012-11-20 16:27 送鲜花  10朵   附言:回答的好 学习本来就是为了玩的 (*^__^*) ...
2012-11-20 15:55
勤不移
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
收藏
得分:7 
回复 楼主 屎宝宝
int name;
初始化肯定有问题啊,name 应该是char *name;去用gets获取name.用int你只能输入数字才能没错。该吧,做好用数组。
2012-11-20 16:04
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
收藏
得分:0 
回复 4楼 勤不移
我就是输入数字的啊 为了方便么
2012-11-20 16:17
勤不移
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-7-21
收藏
得分:0 
  void csh()//初始化
{
    int i,a,j;
    char *name=NULL,c;
    printf("请输入已分配的作业数:\n");
    scanf("%d",&a);
    printf("error1\n");
    for(i=0;i<a;i++)
    {
    printf("请输入已分配作业名:\n");
    getchar();        //作用是读走缓冲区\n
    while((c=getchar())!=10){
        j++;
        if(name ==NULL ){
            j=1;
            name=(char *)malloc(j);
        }else{
            name=(char *)realloc(name,j);
        }
    }
    printf("请输入该作业起始地址:\n");
    scanf("%f",&used[i].address);
    printf("请输入该作业大小:\n");
    scanf("%f",&used[i].length);
    printf("请输入该作业的状态:\n");//0为空闲区,1为已分配
    scanf("%d",&used[i].flag);
    }
    free1[0].address=10;
    free1[0].length=10;
    free1[0].flag=1;
    for(i=1;i<M;i++)
        free1[i].flag=0;
}
在前面加个#include <malloc.h>。因添加头文件free不能使用,要修改。
2012-11-20 16:21
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
收藏
得分:0 
回复 6楼 勤不移
你好厉害 我c语言学的差的 写个代码愁死我了。。。
2012-11-20 16:28
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
收藏
得分:0 
回复 6楼 勤不移
可是分配显示还是不对啊
2012-11-20 16:34
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
收藏
得分:0 
回复 3楼 屎宝宝
以后还需要你多帮助啊。学的不好 多多关照
2012-11-20 16:36
快速回复:一个内存分配回收的程序 为什么不能分配内存啊 求人相助啊
数据加载中...
 
   



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

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