首次适应的内存管理算法c语言代码
时间: 2023-07-26 18:18:47 浏览: 50
以下是一个简单的首次适应内存管理算法的C语言代码:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAX_MEM_SIZE 1024 // 内存池大小
typedef struct Node {
int size; // 内存块大小
struct Node *prev; // 指向前一个内存块
struct Node *next; // 指向后一个内存块
} Node;
Node *mem_pool; // 内存池指针
// 初始化内存池
void init_mem_pool() {
mem_pool = (Node*)malloc(MAX_MEM_SIZE);
mem_pool->size = MAX_MEM_SIZE - sizeof(Node);
mem_pool->prev = mem_pool->next = NULL;
}
// 分配内存
void *alloc_mem(int size) {
Node *p = mem_pool;
while (p) {
if (p->size >= size + sizeof(Node)) { // 找到合适的内存块
Node *new_node = (Node*)((char*)p + sizeof(Node) + size); // 新空闲内存块
new_node->size = p->size - sizeof(Node) - size;
new_node->prev = p;
new_node->next = p->next;
if (p->next) {
p->next->prev = new_node;
}
p->next = new_node;
p->size = size;
return (char*)p + sizeof(Node);
}
p = p->next;
}
return NULL; // 没有合适的内存块
}
// 释放内存
void free_mem(void *p) {
Node *cur_node = (Node*)((char*)p - sizeof(Node));
cur_node->size += sizeof(Node);
if (cur_node->prev && ((char*)cur_node->prev + cur_node->prev->size) == (char*)cur_node) { // 合并前面的空闲内存块
cur_node->prev->size += cur_node->size;
cur_node->prev->next = cur_node->next;
if (cur_node->next) {
cur_node->next->prev = cur_node->prev;
}
cur_node = cur_node->prev;
}
if (cur_node->next && ((char*)cur_node + cur_node->size) == (char*)cur_node->next) { // 合并后面的空闲内存块
cur_node->size += cur_node->next->size + sizeof(Node);
cur_node->next = cur_node->next->next;
if (cur_node->next) {
cur_node->next->prev = cur_node;
}
}
}
int main() {
init_mem_pool();
void *p1 = alloc_mem(100);
void *p2 = alloc_mem(200);
void *p3 = alloc_mem(300);
printf("p1=%p, p2=%p, p3=%p\n", p1, p2, p3);
free_mem(p2);
void *p4 = alloc_mem(150);
printf("p4=%p\n", p4);
return 0;
}
```
该代码中使用了双向链表来管理内存块,每个内存块包含了其大小、前一个内存块和后一个内存块的指针。在分配内存时,算法会从链表头开始遍历,找到第一个大小大于等于要求的内存块,然后将其拆分成一个已分配的内存块和一个空闲的内存块。在释放内存时,算法会将空闲的内存块与相邻的空闲内存块合并,以避免内存碎片的产生。
相关推荐
![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)