📄 myprog.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 + -