封装malloc编写一个malloc16使得返回地址%16==0

本文介绍了如何封装malloc和free,以实现malloc16函数,确保返回的内存地址对齐到16字节边界。讨论了不同的实现思路,包括利用额外空间存储偏移量、使用数据结构保存分配信息,最终得出优化后的解决方案,并提出了进一步的优化思考问题。
摘要由CSDN通过智能技术生成

问题:封装malloc写一个void *malloc16(int _size);使得其的地址刚好是16对其的,也就是说其返回的地址%16==0。然后封装free写一个void free16(void *p);把malloc16分配的空间给回收。。
malloc和free是这么用的。

char *pc=(char*)malloc(1024);
free(pc);

这里我想了好一会儿。
第一个想法:分配空间的时候多分配16个空间,然后指向其第一个地址%16==0的地方,把前面多余的空间释放掉。
A:那你怎么释放它?
想了一会儿。发现不能释放。。
再想了一会儿。
第二个想法:在第一个想法基础上。分配空间的时候多分配16个空间,然后找到其第一个地址%16==0的那个地址,用一个结构体保存其malloc分配的值以及malloc16返回的值,free16的时候根据传进来的值来找是否存在分配过这个值。然后找到malloc的这个值,free掉它。
A:怎么保存这个结构体呢。结构体怎么声明?还是只用一个对象
CHC:使用链表或者其他数据结构。
A:用什么数据结构?
CHC:hash每一个malloc16返回值对应的malloc值。
A:这样是可以的。但是能不能不用数据结构?
又想了一会儿。。
CHC:对于每个malloc16保存一个偏移量,通过这个偏移量找到malloc分配的空间。这个偏移量存放在malloc16返回地址的上一位。
A:你怎么确定它的上一位可以用呢?
对哦。。。如果第一个malloc到的值%16==0那上一位不就越界了吗?
想了一会儿。。
CHC:多分配16*2个空间。malloc出来的地址+16之后再往下找第一个%16==0的那个地址。这个地址的前一位一定是可以用的。
A:哦~你的意思是多申请32个空间,然后来保存偏移量,那 最少 多申请多少空间可以达到这个目标。
想了一会儿。。
CHC:多申请17个空间。。malloc出来的那个地址先+1,然后再找第一个%16==0的地址,返回。
A:那能不能只申请16个空间达到这个目标呢?
想了一会儿。。
CHC:如果它malloc到的第一个地址%16==0的话那它上面的那个空间就没法用到啊?那怎么用。。
A:你再想想。。(看了看时间)哦~时间有点紧,这个地址直接加16就可以。
CHC:这里写图片描述
(沃日。我个傻x,怎么这里被自己坑到了啊啊啊啊啊!!!!!)
A:那你写个代码吧。。

void *malloc16(int _size){
    char *p=(char*)malloc(_size+16),*q;
    if((int)p%16==0){
        q=p+16;
        *(q-1)=16;
    }
    else {
        int cnt=0;q=p;
        while((int)q%16!=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值