⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myprog.c

📁 用char *malloc(unsigned size)函数向系统申请一次内存空间(如size=1000
💻 C
字号:
/* 
  如不会使用文件输入/输出,也不会使用I/O转向做输入和输出结果文件,
	可以手再抄输出结果后后再输到文件中,实验报告的文字内容由自己掌握,
	能多能少。
*/
#include <stdio.h>
#include <malloc.h>		

/*表的定义*/
#define N 5
#define MEMSIZE 1000

typedef struct map 
{
    unsigned m_size;
    char *m_addr;
};

struct map coremap[N];

/*首次适应的分配函数*/
char *fmalloc(unsigned size)
{
    register char *a;
    register struct map *bp;

    for (bp = coremap; bp->m_size; bp++) 
    {
	  if(bp->m_size >= size) 
	  	{
		a = bp->m_addr;
		bp->m_addr += size;
		if((bp->m_size -= size) == 0)
		do  
		{
			bp++;
			(bp-1)->m_addr = bp->m_addr;
		} while((bp-1)->m_size = bp->m_size);
		printf("fmalloc size: %d, addr:%d\n", size, a);
		return(a);
	    }
    }
    return(0);
}

/* 首次适应的释放函数 */
ffree(unsigned size, char *aa)
{
    struct map *bp;
    char *a, *t;
    unsigned tt;

    printf("ffree mem size=%u, addr=%u\n", size, aa);
    
    a = aa;
    for (bp=coremap; bp->m_addr<=a && bp->m_size!=0; bp++);
    if (bp>coremap && (bp-1)->m_addr+(bp-1)->m_size == a) /* 情况1,2 */
	{ 	
        (bp-1)->m_size += size;				/* 情况1 */
        
        if (a+size == bp->m_addr)     /* 情况2 */
		{			
            (bp-1)->m_size += bp->m_size;
            while (bp->m_size) 
			{
                bp++;
                (bp-1)->m_addr = bp->m_addr;
                (bp-1)->m_size = bp->m_size;
    	} 
  	}
  }
    else 	
	{
        if (a+size == bp->m_addr && bp->m_size) /* 情况3 */
		{				
            		bp->m_addr -= size;
            		bp->m_size += size;
    }
        else    						
            if (size)/* 情况4 */
                do 
		{
                    t = bp->m_addr;
                    bp->m_addr = a;
                    a = t;
                    tt = bp->m_size;
                    bp->m_size = size;
                    bp++;
    } while (size = tt); 
  }   
}


/*  coremap表的初始化程序 */
void initcoremap(char *addr, unsigned size)
{
	int i;
	printf("init coremap, first addr: %d\n", addr);
	coremap[0].m_size=size;
	coremap[0].m_addr=addr;
	for(i=1;i<N;i++) 
	{
		coremap[i].m_size=0;
		coremap[i].m_addr=0;
	}
  /* 
  初始化coremap数组,使其
	第一项的m_addr指向用malloc申请到的addr,
	第一项的m_size等于malloc申请的size,
	其他各项清0 
	*/
}

/*  输出表的内容 */
void printcoremap()
{
	int i;
	for(i=0;i<N;i++) 
	{
		printf("coremap[%d].m_addr=%d ",i,coremap[i].m_addr);
		printf("coremap[%d].m_size=%d\n",i,coremap[i].m_size);
	}
    /* Function body:  打印coremap表中各项的m_size和m_addr  */
}

/*  主程序的框架 */
int main() {
	char *mymem;
	int size;
	int addr;
	char cmdchar;
	char c;
	if ((mymem = malloc(MEMSIZE)) == NULL)
    {
      printf("Not enough memory to allocate buffer\n"); 
      exit(1); 
    }
	initcoremap(mymem, MEMSIZE);
	
	while(c!='q')
	{
		do 
		{
			c=getchar();
		}
		while(c=='\n'||c=='\t'||c==' ');
		cmdchar=c;
		switch (cmdchar)
		{
		case 'm':
			scanf("%u", &size);
			fmalloc(size);
			break;
		case 'f':
			scanf("%u %u", &size, &addr);
			ffree(size, mymem+addr);
			break;
		case 'p':
			printcoremap();
			break;
		default:
			break;
		}
	}
	free(mymem);
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -