问题:封装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!=