C语言实现连续分配,链接分配,索引分配等三种分配方式
时间: 2023-07-07 20:04:32 浏览: 193
C语言实现连续分配,链接分配,索引分配等三种分配方式的具体实现如下:
1. 连续分配:
连续分配是指将内存分为若干个大小相等的块,当有进程需要内存时,就从这些块中找出一个大小合适的块分配给它。连续分配一般使用指针和数组来实现。
示例代码:
```c
#define MEM_SIZE 1000 // 内存大小
char mem[MEM_SIZE]; // 内存空间
struct mem_block { // 内存块结构体
int size; // 内存块大小
int used; // 是否已经被使用
};
struct mem_block *free_mem_list; // 空闲内存块链表
void init_mem() { // 初始化内存管理
free_mem_list = (struct mem_block *)mem;
free_mem_list->size = MEM_SIZE - sizeof(struct mem_block);
free_mem_list->used = 0;
}
void *malloc(int size) { // 分配内存
struct mem_block *p, *new_block;
void *ptr;
for (p = free_mem_list; p != NULL; p = p->next) {
if (!p->used && p->size >= size + sizeof(struct mem_block)) {
new_block = (struct mem_block *)((char *)p + sizeof(struct mem_block) + size);
new_block->size = p->size - size - sizeof(struct mem_block);
new_block->used = 0;
p->size = size;
p->used = 1;
ptr = (void *)((char *)p + sizeof(struct mem_block));
return ptr;
}
}
return NULL;
}
void free(void *ptr) { // 释放内存
struct mem_block *p, *prev, *next;
p = (struct mem_block *)((char *)ptr - sizeof(struct mem_block));
p->used = 0;
prev = free_mem_list;
for (next = free_mem_list->next; next != NULL; prev = next, next = next->next) {
if (next > p) {
break;
}
}
p->next = next;
prev->next = p;
if (next != NULL && (char *)p + p->size + sizeof(struct mem_block) == (char *)next) {
p->size += sizeof(struct mem_block) + next->size;
p->next = next->next;
}
if (prev != free_mem_list && (char *)prev + prev->size + sizeof(struct mem_block) == (char *)p) {
prev->size += sizeof(struct mem_block) + p->size;
prev->next = p->next;
}
}
```
2. 链接分配:
链接分配是指将内存分为若干个大小不等的块,每个块都有一个头结点,用于记录该块的状态。
示例代码:
```c
struct mem_block { // 内存块结构体
int size; // 内存块大小
int used; // 是否已经被使用
struct mem_block *next; // 下一个内存块指针
};
struct mem_block *free_mem_list; // 空闲内存块链表
void init_mem() { // 初始化内存管理
free_mem_list = (struct mem_block *)malloc(MEM_SIZE);
free_mem_list->size = MEM_SIZE - sizeof(struct mem_block);
free_mem_list->used = 0;
free_mem_list->next = NULL;
}
void *malloc(int size) { // 分配内存
struct mem_block *p, *prev, *new_block;
void *ptr;
prev = free_mem_list;
for (p = free_mem_list; p != NULL; prev = p, p = p->next) {
if (!p->used && p->size >= size + sizeof(struct mem_block)) {
new_block = (struct mem_block *)((char *)p + sizeof(struct mem_block) + size);
new_block->size = p->size - size - sizeof(struct mem_block);
new_block->used = 0;
p->size = size;
p->used = 1;
new_block->next = p->next;
p->next = new_block;
ptr = (void *)((char *)p + sizeof(struct mem_block));
return ptr;
}
}
return NULL;
}
void free(void *ptr) { // 释放内存
struct mem_block *p, *prev, *next;
p = (struct mem_block *)((char *)ptr - sizeof(struct mem_block));
p->used = 0;
prev = free_mem_list;
for (next = free_mem_list->next; next != NULL; prev = next, next = next->next) {
if (next > p) {
break;
}
}
p->next = next;
prev->next = p;
if (next != NULL && (char *)p + p->size + sizeof(struct mem_block) == (char *)next) {
p->size += sizeof(struct mem_block) + next->size;
p->next = next->next;
}
if (prev != free_mem_list && (char *)prev + prev->size + sizeof(struct mem_block) == (char *)p) {
prev->size += sizeof(struct mem_block) + p->size;
prev->next = p->next;
}
}
```
3. 索引分配:
索引分配是指将内存分为若干个大小相等的块,每个块都有一个索引表,记录该块的状态。
示例代码:
```c
struct mem_block { // 内存块结构体
int size; // 内存块大小
int used; // 是否已经被使用
};
struct mem_index { // 内存索引结构体
int used; // 是否已经被使用
int block_num; // 内存块编号
};
struct mem_block mem_blocks[MEM_BLOCK_NUM]; // 内存块数组
struct mem_index mem_indexs[MEM_BLOCK_NUM]; // 内存索引数组
void init_mem() { // 初始化内存管理
int i;
for (i = 0; i < MEM_BLOCK_NUM; i++) {
mem_blocks[i].size = MEM_BLOCK_SIZE;
mem_blocks[i].used = 0;
mem_indexs[i].used = 0;
mem_indexs[i].block_num = i;
}
}
void *malloc(int size) { // 分配内存
int i;
for (i = 0; i < MEM_BLOCK_NUM; i++) {
if (!mem_blocks[i].used && mem_blocks[i].size >= size) {
mem_blocks[i].used = 1;
mem_indexs[i].used = 1;
return (void *)&mem_blocks[i];
}
}
return NULL;
}
void free(void *ptr) { // 释放内存
int i;
struct mem_block *p = (struct mem_block *)ptr;
for (i = 0; i < MEM_BLOCK_NUM; i++) {
if (&mem_blocks[i] == p) {
mem_blocks[i].used = 0;
mem_indexs[i].used = 0;
break;
}
}
}
```