写一个随机申请和归还各种规格的储存块的过程检验伙伴系统的c语言的代码
时间: 2024-01-22 13:17:37 浏览: 29
以下是一个简单的随机申请和归还储存块的过程检验伙伴系统的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MEM_SIZE 1024 // 内存大小
#define MIN_BLOCK_SIZE 16 // 最小块大小
#define MAX_BLOCK_SIZE 256 // 最大块大小
typedef struct Block { // 储存块的结构体
int size; // 块的大小
int free; // 是否空闲
struct Block* next; // 下一个块的指针
} Block;
Block* mem = NULL; // 内存块链表的头指针
// 初始化内存块链表
void init_mem() {
mem = (Block*)malloc(sizeof(Block)); // 分配内存
mem->size = MEM_SIZE; // 初始块大小为整个内存大小
mem->free = 1; // 初始块为空闲状态
mem->next = NULL;
}
// 随机生成一个块大小
int rand_block_size() {
return (rand() % (MAX_BLOCK_SIZE - MIN_BLOCK_SIZE + 1)) + MIN_BLOCK_SIZE;
}
// 按照块大小查找空闲块
Block* find_free_block(int size) {
Block* p = mem;
while (p != NULL) {
if (p->size >= size && p->free) {
return p;
}
p = p->next;
}
return NULL;
}
// 分配块
Block* allocate_block(int size) {
Block* p = find_free_block(size);
if (p == NULL) {
return NULL;
}
if (p->size > size) { // 如果空闲块比需要的块大,则分裂成两个块
Block* new_block = (Block*)malloc(sizeof(Block));
new_block->size = p->size - size;
new_block->free = 1;
new_block->next = p->next;
p->next = new_block;
p->size = size;
}
p->free = 0;
return p;
}
// 归还块
void free_block(Block* p) {
p->free = 1;
// 如果前面或后面有空闲块,则合并
if (p->next != NULL && p->next->free) {
p->size += p->next->size;
p->next = p->next->next;
}
if (p != mem && p->free && p->next != NULL && p->next->free) {
Block* prev = mem;
while (prev->next != p) {
prev = prev->next;
}
prev->size += p->size + p->next->size;
prev->next = p->next->next;
free(p->next);
free(p);
}
else if (p != mem && p->free) {
Block* prev = mem;
while (prev->next != p) {
prev = prev->next;
}
prev->size += p->size;
prev->next = p->next;
free(p);
}
}
int main() {
srand(time(NULL)); // 初始化随机数种子
init_mem(); // 初始化内存块链表
// 随机申请和归还块
for (int i = 0; i < 100; i++) {
int size = rand_block_size();
printf("申请块大小:%d\n", size);
Block* p = allocate_block(size);
if (p == NULL) {
printf("无法申请到块\n");
}
else {
printf("申请到了块,地址:%p,大小:%d\n", p, p->size);
free_block(p);
printf("归还块,地址:%p\n", p);
}
printf("\n");
}
return 0;
}
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)