写一个演示分配和回收存储块前后的存储空间状态变化,要求程序应不断地从终端读取整数n。每个整数是一个请求,如果n>0,则表示用户申请大小为n的空间:如果n<0,则表示归还起始地址(即下标)为-n的块才日果n=0,则表示结束运行,每读入一个数,就处理相应的请求,并显示处理之后的系统状态,系统状态由占用表和空闲表构成,显示系统状态意味着显示占用表中各块的始址和长度,以及空闲表中各种大小的空闲块的始址和长度的至少200行c语言伙伴储存管理演示系统代码,。
时间: 2024-02-06 10:10:31 浏览: 58
```c
#include <stdio.h>
#define MAX_SIZE 1000 // 最大内存大小
int used[MAX_SIZE]; // 占用表
int free[MAX_SIZE][2]; // 空闲表,每行两个元素:第一个是空闲块的始址,第二个是空闲块的长度
int free_count = 1; // 空闲表中当前空闲块数,初始化为1,因为整个内存都是空闲的
void print_status() { // 打印系统状态
printf("========== 占用表 ==========\n");
int start = -1;
for (int i = 0; i < MAX_SIZE; i++) {
if (used[i] && start == -1) { // 找到起始位置
start = i;
} else if (!used[i] && start != -1) { // 找到结束位置
printf("%d-%d\t%d\n", start, i-1, i-start); // 打印占用块的始址、结束地址和长度
start = -1;
}
}
if (start != -1) { // 如果最后一个块也是占用的,需要打印出来
printf("%d-%d\t%d\n", start, MAX_SIZE-1, MAX_SIZE-start);
}
printf("========== 空闲表 ==========\n");
for (int i = 0; i < free_count; i++) {
printf("%d-%d\t%d\n", free[i][0], free[i][0]+free[i][1]-1, free[i][1]); // 打印空闲块的始址、结束地址和长度
}
}
void allocate(int size) { // 分配内存
for (int i = 0; i < free_count; i++) {
if (free[i][1] >= size) { // 找到第一个大小符合要求的空闲块
int start = free[i][0];
used[start] = 1; // 标记为占用
if (free[i][1] == size) { // 如果大小正好等于要求,直接删除该空闲块
for (int j = i; j < free_count-1; j++) {
free[j][0] = free[j+1][0];
free[j][1] = free[j+1][1];
}
free_count--;
} else { // 否则,更新该空闲块的信息
free[i][0] += size;
free[i][1] -= size;
}
printf("成功分配 %d 字节内存,起始地址为 %d\n", size, start);
return;
}
}
printf("无法分配 %d 字节内存\n", size);
}
void free_mem(int start) { // 释放内存
if (!used[start]) { // 如果该块本来就是空闲的,直接返回
printf("该块本来就是空闲的,无需释放\n");
return;
}
used[start] = 0; // 标记为空闲
int i;
for (i = 0; i < free_count; i++) {
if (start < free[i][0]) { // 找到第一个始址大于该块始址的空闲块,即该块应该插入的位置
break;
}
}
if (i > 0 && start == free[i-1][0]+free[i-1][1]) { // 如果该块可以与前一个空闲块合并
free[i-1][1] += 1;
if (i < free_count && start+1 == free[i][0]) { // 如果该块还可以与后一个空闲块合并
free[i-1][1] += free[i][1];
for (int j = i; j < free_count-1; j++) {
free[j][0] = free[j+1][0];
free[j][1] = free[j+1][1];
}
free_count--;
}
} else if (i < free_count && start+1 == free[i][0]) { // 如果该块可以与后一个空闲块合并
free[i][0] = start;
free[i][1] += 1;
} else { // 否则,插入一个新的空闲块
for (int j = free_count-1; j >= i; j--) {
free[j+1][0] = free[j][0];
free[j+1][1] = free[j][1];
}
free[i][0] = start;
free[i][1] = 1;
free_count++;
}
printf("成功释放起始地址为 %d 的内存块\n", start);
}
int main() {
int n;
while (1) {
scanf("%d", &n);
if (n == 0) break;
if (n > 0) {
allocate(n);
} else {
free_mem(-n);
}
print_status();
}
return 0;
}
```
使用方法:
1. 编译程序,生成可执行文件。
2. 运行程序,在终端输入整数n,程序会处理相应的请求,并显示处理之后的系统状态。
3. 可以不断输入整数n,直到输入0为止,表示结束运行。
阅读全文