编程救命aaa 2022-04-19 17:37 采纳率: 100%
浏览 81
已结题

C语言初始化heap问题

需要完成一个函数: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值还是会的,后半部分的这个内存分配和指针相关问题查了半天还是非常地懵…我的这个任务应该是和内存分配和释放有关;该任务只是一项大任务的一部分,所以任务描述里可能涉及一些前边已经设置过的量;不知道能否麻烦有专家描述或者写一下这个函数部分(如果有注释更好;然后代码写个大概也可以的,只是想参考那个内存到底怎么处理,非常感谢)让我可以参考并学习理解一下和内存有关的这个部分我应该怎么操作,谢谢!
原任务图片如下

img

  • 写回答

2条回答 默认 最新

  • 关注

    参考如下:

    
    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月25日
  • 已采纳回答 4月22日
  • 修改了问题 4月19日
  • 创建了问题 4月19日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分