malloc源码

两个函数取自UNIX 版本6 malloc.c文件,一个为malloc函数,一个为mfree函数
2515:/map数组是一个空闲资源列表,其中每个存储区由其长度和相对地址定义/
struct map
2516: {
2517: char *m_size;
2518: char *m_addr;
2519: };
2520: /* ————————— */
2521:
2522: /*
2523: * Allocate size units from the given
2524: * map. Return the base of the allocated
2525: * space.
2526: * Algorithm is first fit.
2527: */
2528: malloc(mp, size)
2529: struct map *mp;
2530: {
2531: register int a;
2532: register struct map *bp;
2533:
2534: for (bp = mp; bp->m_size; bp++) { /搜索map数组,直到到达map列表尾部,或者搜索到一个长度满足请求的空闲空间/
2535: if (bp->m_size >= size) { /该空闲块满足请求/
2536: a = bp->m_addr; /记录该区首地址/
2537: bp->m_addr =+ size; /空闲块地址首端大小为size块被分配,因此首地址前移size/
2538: if ((bp->m_size =- size) == 0) /分配的空闲块大小刚好等于请求空间的大小/
2539: do { /将该空间块在map中的后继记录前移/
2540: bp++;
2541: (bp-1)->m_addr = bp->m_addr;
2542: } while ((bp-1)->m_size = bp->m_size);
2543: return(a);
2544: }
2545: }
2546: return(0);
2547: }
2548: /* ————————— */
2549:
2550: /*
2551: * Free the previously allocated space aa
2552: * of size units into the specified map.
2553: * Sort aa into map and combine on
2554: * one or both ends if possible.
2555: */
/将一个大小为size,起始地址为aa的存储区还给map/
2556: mfree(mp, size, aa)
2557: struct map *mp;
2558: {
2559: register struct map *bp;
2560: register int t;
2561: register int a;
2562:
2563: a = aa;
2564: for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++); /搜索map,直到找到map中起始地址小于释放空间地址的记录/
2565: if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { /释放空间和前一空间连续/
2566: (bp-1)->m_size =+ size; /map中前一元素的大小增加被释放空间的大小/
2567: if (a+size == bp->m_addr) { /释放的存储区是否与map中下一个区块相邻/
2568: (bp-1)->m_size =+ bp->m_size; /合并被释放块和后一块存储区/
2569: while (bp->m_size) { /前移余下的存储区/
2570: bp++;
2571: (bp-1)->m_addr = bp->m_addr;
2572: (bp-1)->m_size = bp->m_size;
2573: }
2574: }
2575: } else { /不与前一空间连续/
2576: if (a+size == bp->m_addr && bp->m_size) { /是否与后一空间连续/
2577: bp->m_addr =- size;
2578: bp->m_size =+ size;
2579: } else if (size) do { /释放空间大小不为0,在map中加入新记录,后移map中余下的空间记录/
2580: t = bp->m_addr;
2581: bp->m_addr = a;
2582: a = t;
2583: t = bp->m_size;
2584: bp->m_size = size;
2585: bp++;
2586: } while (size = t);
2587: }
2588: }
2589: /* ————————— */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值