需要完成一个函数:it init_heap(uint32-t size)
任务描述:这个函数分配一个大小为字节的内存区域,所有的分配都将在该区域内进行。如果size小于最小堆大小(4096),则size被设置为最小堆大小。size的值也被四舍五入到最接近4的倍数(例如,5001将被四舍五入到5004)。
这个函数设置my_heap。Heap_mem指向已分配区域的第一个字节。然后,它将该区域初始化为单个大的空闲空间块。最后,该函数分配一个大小为size/HEADER_SIZE的free_list数组,该数组包含指向heap_mem中空闲块的指针,并将该数组中的第一项设置为单个空闲空间块。如果它能够成功地完成以上所有操作,init_heap()返回0;否则,返回-1。
我的问题:这个任务前半部分分类讨论然后设置size值还是会的,后半部分的这个内存分配和指针相关问题查了半天还是非常地懵…我的这个任务应该是和内存分配和释放有关;该任务只是一项大任务的一部分,所以任务描述里可能涉及一些前边已经设置过的量;不知道能否麻烦有专家描述或者写一下这个函数部分(如果有注释更好;然后代码写个大概也可以的,只是想参考那个内存到底怎么处理,非常感谢)让我可以参考并学习理解一下和内存有关的这个部分我应该怎么操作,谢谢!
原任务图片如下
参考如下:
#include <stdio.h>
#include <stdlib.h>
#define ALLOC (int)1
#define FREE (int)2
#define uint32_t unsigned int
typedef unsigned char byte;
typedef struct header {
uint32_t status;
uint32_t size;
byte data[]; //这个变量是无法改变的,这么些会有问题,图片中说这个变量不关心,所以先不管他了
}header_type;
typedef struct heap_infomation {
byte* heap_mem;
uint32_t heap_size;
byte** free_list;
uint32_t free_capacity;
uint32_t n_free;
}heap_information_type;
static struct heap_infomation my_heap;
#define HEADER_SIZE (sizeof(struct header));
int init_heap(uint32_t size)
{
if (size < 4096)
size = 4096;
else if (size % 4 != 0)
{
size = (size / 4 + 1) * 4;
}
my_heap.heap_mem = (byte*)malloc(size); //申请空间
if (my_heap.heap_mem == 0)
return -1;
my_heap.heap_size = size;
int k = size / HEADER_SIZE;
my_heap.free_capacity = my_heap.n_free = k;
byte** free_list = (byte**)malloc(k * sizeof(byte*)); //申请数组空间
if (free_list == 0)
return -1;
for (int i = 0; i < k; i++)
{
free_list[i] = my_heap.heap_mem + i * HEADER_SIZE;
header_type* tt = (header_type*)free_list[i];
tt->status = FREE;
//tt->data = free_list[i]; //这个先不管了,结构体中使用的数组,无法给它赋值
tt->size = 0;
}
return 1;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!