visual c++中用 c 语言实现内存分配与回收,要求有退出系统,显示分区,分配分区和回收分区功能,给出完整的可运行成功的代码
时间: 2024-02-16 11:05:27 浏览: 67
下面是一个简单的实现内存分配与回收的 C 语言程序,包含了退出系统、显示分区、分配分区和回收分区等功能:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1024
// 内存分区结构体
typedef struct {
int start; // 分区起始地址
int size; // 分区大小
int status; // 分区状态(0-空闲,1-已分配)
} MemBlock;
MemBlock mem_blocks[MAX_SIZE]; // 内存分区数组
int block_num = 0; // 内存分区数量
// 初始化内存分区
void init_mem_blocks() {
mem_blocks[0].start = 0;
mem_blocks[0].size = MAX_SIZE;
mem_blocks[0].status = 0;
block_num = 1;
}
// 显示内存分区
void show_mem_blocks() {
printf("Memory Blocks:\n");
printf("Start Address\tSize\tStatus\n");
for (int i = 0; i < block_num; i++) {
printf("%d\t\t%d\t%d\n", mem_blocks[i].start, mem_blocks[i].size, mem_blocks[i].status);
}
}
// 分配内存
int allocate_mem(int size) {
int i;
for (i = 0; i < block_num; i++) {
if (mem_blocks[i].status == 0 && mem_blocks[i].size >= size) {
// 找到空闲分区,分配内存
mem_blocks[i].status = 1;
if (mem_blocks[i].size > size) {
// 分裂分区
mem_blocks[block_num].start = mem_blocks[i].start + size;
mem_blocks[block_num].size = mem_blocks[i].size - size;
mem_blocks[block_num].status = 0;
mem_blocks[i].size = size;
block_num++;
}
return mem_blocks[i].start;
}
}
return -1; // 没有可用分区
}
// 释放内存
void free_mem(int start) {
for (int i = 0; i < block_num; i++) {
if (mem_blocks[i].start == start) {
// 找到要释放的分区
mem_blocks[i].status = 0;
if (i > 0 && mem_blocks[i-1].status == 0) {
// 合并前面的空闲分区
mem_blocks[i-1].size += mem_blocks[i].size;
for (int j = i; j < block_num - 1; j++) {
mem_blocks[j] = mem_blocks[j+1];
}
block_num--;
i--;
}
if (i < block_num - 1 && mem_blocks[i+1].status == 0) {
// 合并后面的空闲分区
mem_blocks[i].size += mem_blocks[i+1].size;
for (int j = i+1; j < block_num - 1; j++) {
mem_blocks[j] = mem_blocks[j+1];
}
block_num--;
}
break;
}
}
}
int main() {
int choice, size, start;
init_mem_blocks(); // 初始化内存分区
do {
printf("\n1. Show memory blocks\n");
printf("2. Allocate memory\n");
printf("3. Free memory\n");
printf("4. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
show_mem_blocks();
break;
case 2:
printf("Enter the size to allocate: ");
scanf("%d", &size);
start = allocate_mem(size);
if (start == -1) {
printf("Failed to allocate memory.\n");
} else {
printf("Memory allocated at address %d.\n", start);
}
break;
case 3:
printf("Enter the start address to free: ");
scanf("%d", &start);
free_mem(start);
printf("Memory freed.\n");
break;
case 4:
printf("Exiting...\n");
break;
default:
printf("Invalid choice.\n");
}
} while (choice != 4);
return 0;
}
```
该程序使用内存分区结构体来表示内存分区,包含了分区起始地址、分区大小和分区状态等信息。在初始化内存分区时,只有一个完整的空闲分区。在分配内存时,先找到第一个满足要求的空闲分区,如果分配后剩余空间大于零,则将剩余部分分裂成一个新的空闲分区。在释放内存时,如果相邻的空闲分区可以合并,则将它们合并成一个更大的空闲分区。
该程序可以通过菜单选择功能,包括显示内存分区、分配内存、释放内存和退出系统。
阅读全文