免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 688 | 回复: 0
打印 上一主题 下一主题

[C] 丹尼斯.里奇的c语言教程malloc例子两个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-19 17:34 |只看该作者 |倒序浏览
  1. /**
  2. QUESTION1: bp < p->s.ptr 什么时候出现,插入到哪里?
  3. ANSWER1:

  4. QUESTION2: join to lower, freep好像指向的位置比其他情况不一样,这会导致什么问题,会导致morecore多一次调用吗.
  5. ANSWER2: 会导致循环开始位置不一样,不会导致morecore多一次调用,假如只能使用这次释放的内存块的话,
  6.                  会循环过去,指到freep位置时,大小满足了,就拿到数据返回.
  7.                  
  8. QUESTION3: &base地址在ubuntu64bit上测试确实比sbrk获得的地址低,这依靠了系统相关特性,假如在相反的平台上程序是否可以正常运行.       
  9. ANSWER3:                
  10. */
  11. #include <stdio.h>

  12. typedef long Align; /* for alignment to long boundary */
  13. union header { /* block header */
  14.         struct {
  15.                 union header *ptr; /* next block if on free list */
  16.                 unsigned size; /* size of this block */
  17.         } s;
  18.         Align x; /* force alignment of blocks */
  19. };
  20. typedef union header Header;

  21. static Header base; /* empty list to get started */
  22. static Header *freep = NULL; /* start of free list */

  23. /* free: put block ap(AccessPoint) in free list */
  24. void free(void *ap)
  25. {
  26.         Header *bp, *p;
  27.         bp = (Header *)ap - 1; /* point to block header */
  28.         for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  29.         {               
  30.                 if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) /* QUESTION1 */
  31.                 {
  32.                         break; /* freed block at start or end of arena */
  33.                 }       
  34.         }
  35.                
  36.         if (bp + bp->s.size == p->s.ptr) { /* join to upper(next) nbr */
  37.                 bp->s.size += p->s.ptr->s.size;
  38.                 bp->s.ptr = p->s.ptr->s.ptr;
  39.         }
  40.         else
  41.                 bp->s.ptr = p->s.ptr;
  42.        
  43.         if (p + p->s.size == bp) { /* join to lower(prev) nbr */
  44.                 p->s.size += bp->s.size;/* QUESTION2 */
  45.                 p->s.ptr = bp->s.ptr;
  46.         }
  47.         else
  48.                 p->s.ptr = bp;
  49.        
  50.         freep = p;
  51. }

  52. #define NALLOC 1024 /* minimum #units to request */
  53. /* morecore: ask system for more memory */
  54. static Header *morecore(unsigned nu)
  55. {
  56.         char *cp, *sbrk(int);
  57.         Header *up;
  58.         if (nu < NALLOC)
  59.                 nu = NALLOC;       
  60.         cp = sbrk(nu * sizeof(Header));
  61.         if (cp == (char *)-1) /* no space at all */
  62.                 return NULL;
  63.         up = (Header *)cp;
  64.         up->s.size = nu;
  65.         free((void *)(up + 1));
  66.         return freep;
  67. }

  68. /* malloc: general-purpose storage allocator */
  69. void *malloc(unsigned nbytes)
  70. {
  71.         Header *p, *prevp;
  72.         Header *moreroce(unsigned);
  73.         unsigned nunits;
  74.         nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1;

  75.         if ((prevp = freep) == NULL) { /* no free list yet */
  76.                 base.s.ptr = freep = prevp = &base; /* QUESTION3 */
  77.                 base.s.size = 0;
  78.         }
  79.         for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) {
  80.                 if (p->s.size >= nunits) { /* big enough */
  81.                         if (p->s.size == nunits) /* exactly */
  82.                         {
  83.                                 prevp->s.ptr = p->s.ptr;                       
  84.                         }
  85.                         else { /* allocate tail end */
  86.                                 p->s.size -= nunits;
  87.                                 p += p->s.size;
  88.                                 p->s.size = nunits;                       
  89.                         }
  90.                         freep = prevp;
  91.                        
  92.                         return (void *)(p + 1);
  93.                 }
  94.                 if (p == freep) /* wrapped around free list */
  95.                         if ((p = morecore(nunits)) == NULL)
  96.                                 return NULL; /* none left */
  97.         }
  98. }


  99. int main(int argc, char* argv[])
  100. {
  101.         char* p0=NULL;
  102.         char* p1=NULL;
  103.         char* p2=NULL;
  104.         char* p3=NULL;
  105.         char* p4=NULL;       
  106.                
  107.         p0=malloc(4096);
  108.         if(NULL!=p0)
  109.         {               
  110.                 free(p0);       
  111.         }
  112.        
  113.         p1=malloc(1024);
  114.         p2=malloc(1024);
  115.         p3=malloc(1024);
  116.         p4=malloc(1024);       
  117.        
  118.         if(NULL!=p1)
  119.         {               
  120.                 free(p1);               
  121.         }
  122.        
  123.         if(NULL!=p2)
  124.         {               
  125.                 free(p2);               
  126.         }

  127.         if(NULL!=p3)
  128.         {               
  129.                 free(p3);       
  130.         }

  131.         if(NULL!=p4)
  132.         {
  133.                 free(p4);       
  134.         }       
  135.         return 0;
  136. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP