亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 917 | 回復(fù): 0
打印 上一主題 下一主題

[C] 丹尼斯.里奇的c語言教程malloc例子兩個疑問 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-05-19 17:35 |只看該作者 |倒序瀏覽
  1. /**
  2. QUESTION1: bp < p->s.ptr 什么時候出現(xiàn),插入到哪里?
  3. ANSWER1:

  4. QUESTION2: join to lower, freep好像指向的位置比其他情況不一樣,這會導(dǎo)致什么問題,會導(dǎo)致morecore多一次調(diào)用嗎.
  5. ANSWER2: 會導(dǎo)致循環(huán)開始位置不一樣,不會導(dǎo)致morecore多一次調(diào)用,假如只能使用這次釋放的內(nèi)存塊的話,
  6.                  會循環(huán)過去,指到freep位置時,大小滿足了,就拿到數(shù)據(jù)返回.
  7.                  
  8. QUESTION3: &base地址在ubuntu64bit上測試確實比sbrk獲得的地址低,這依靠了系統(tǒng)相關(guān)特性,假如在相反的平臺上程序是否可以正常運行.       
  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. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP