帮我用c语言实现在初始化时申请几种大小不同的内存各几个,然后在使用时根据需要的大小进行查询使用
时间: 2024-02-18 16:05:13 浏览: 56
好的,以下是用C语言实现在初始化时申请几种大小不同的内存各几个,然后在使用时根据需要的大小进行查询使用的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define NUM_SIZES 3 // 内存块大小种类
#define NUM_BLOCKS {5, 10, 15} // 每种内存块大小的数量
int block_sizes[NUM_SIZES] = {32, 64, 128}; // 内存块大小
void *blocks[NUM_SIZES][NUM_BLOCKS] = {NULL}; // 存储内存块指针的数组
int free_blocks[NUM_SIZES] = {NUM_BLOCKS}; // 剩余可用的内存块数量
void *get_memory_block(int size) {
int i, j;
void *ptr = NULL;
for (i = 0; i < NUM_SIZES; i++) {
if (block_sizes[i] >= size && free_blocks[i] > 0) {
// 找到第一个满足要求的内存块
// 从后往前遍历,避免频繁移动内存块指针
for (j = NUM_BLOCKS[i] - 1; j >= 0; j--) {
if (blocks[i][j] != NULL) {
ptr = blocks[i][j]; // 找到可用的内存块
blocks[i][j] = NULL; // 将内存块指针置为NULL,表示已被分配
free_blocks[i]--; // 剩余可用的内存块数量减1
break;
}
}
break;
}
}
return ptr;
}
void release_memory_block(void *ptr) {
int i, j;
for (i = 0; i < NUM_SIZES; i++) {
// 遍历所有内存块,找到被释放的内存块,将其指针存储到blocks数组中
for (j = 0; j < NUM_BLOCKS[i]; j++) {
if (blocks[i][j] == NULL) {
blocks[i][j] = ptr; // 将内存块指针存储到blocks数组中
free_blocks[i]++; // 剩余可用的内存块数量加1
return;
}
}
}
}
int main() {
int i, j;
// 初始化内存块
for (i = 0; i < NUM_SIZES; i++) {
for (j = 0; j < NUM_BLOCKS[i]; j++) {
blocks[i][j] = malloc(block_sizes[i]); // 申请内存
}
}
// 使用内存块
void *ptr1 = get_memory_block(64); // 申请一个大小为64的内存块
void *ptr2 = get_memory_block(128); // 申请一个大小为128的内存块
// 释放内存块
release_memory_block(ptr1);
release_memory_block(ptr2);
// 释放所有内存块
for (i = 0; i < NUM_SIZES; i++) {
for (j = 0; j < NUM_BLOCKS[i]; j++) {
free(blocks[i][j]); // 释放内存
}
}
return 0;
}
```
以上代码中,我们首先定义了三种不同大小的内存块,以及每种内存块的数量。然后使用二维数组 `blocks` 存储每个内存块的指针,使用数组 `free_blocks` 存储每种内存块剩余可用的数量。
在程序初始化时,我们使用双重循环申请所有内存块,并将内存块指针存储到 `blocks` 数组中。在使用内存块时,调用函数 `get_memory_block`,该函数会在所有内存块中查找第一个满足要求的内存块,将其指针返回。在释放内存块时,调用函数 `release_memory_block`,该函数会将被释放的内存块指针存储到 `blocks` 数组中,以便下次使用时直接取出。
在程序结束时,我们需要释放所有内存块,以免造成内存泄漏。
阅读全文