美女网站一区二区_在线观看日韩毛片_成人在线视频首页_欧美精品一区二区三区久久久_国产精品亚洲一区二区三区在线_日本免费新一区视频_日本美女一区二区三区_精品亚洲成a人_久久不见久久见免费视频1_91首页免费视频_欧美一区二区在线看_91精品91久久久中77777_天堂蜜桃一区二区三区_av在线一区二区_欧美不卡一区二区_欧美影视一区二区三区

產(chǎn)品分類

當(dāng)前位置: 首頁(yè) > 工業(yè)電氣產(chǎn)品 > 端子與連接器 > 汽車連接器

類型分類:
科普知識(shí)
數(shù)據(jù)分類:
汽車連接器

淺析malloc()的幾種實(shí)現(xiàn)方式

發(fā)布日期:2022-04-27 點(diǎn)擊率:144

    malloc()是C語(yǔ)言中動(dòng)態(tài)存儲(chǔ)管理的一組標(biāo)準(zhǔn)庫(kù)函數(shù)之一。其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。其參數(shù)是一個(gè)無(wú)符號(hào)整形數(shù),返回值是一個(gè)指向所分配的連續(xù)存儲(chǔ)域的起始地址的指針。 

  動(dòng)態(tài)內(nèi)存分配就是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。本文簡(jiǎn)單介紹動(dòng)態(tài)內(nèi)存分配函數(shù)malloc()及幾種實(shí)現(xiàn)方法。

  1. 簡(jiǎn)介

  malloc()是C語(yǔ)言中動(dòng)態(tài)存儲(chǔ)管理的一組標(biāo)準(zhǔn)庫(kù)函數(shù)之一。其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。其參數(shù)是一個(gè)無(wú)符號(hào)整形數(shù),返回值是一個(gè)指向所分配的連續(xù)存儲(chǔ)域的起始地址的指針。還有一點(diǎn)必須注意的是,當(dāng)函數(shù)未能成功分配存儲(chǔ)空間(如內(nèi)存不足)就會(huì)返回一個(gè)NULL指針。所以在調(diào)用該函數(shù)時(shí)應(yīng)該檢測(cè)返回值是否為NULL并執(zhí)行相應(yīng)的操作。

  2. 函數(shù)說(shuō)明

  C語(yǔ)言的動(dòng)態(tài)存儲(chǔ)管理由一組標(biāo)準(zhǔn)庫(kù)函數(shù)實(shí)現(xiàn),其原型在標(biāo)準(zhǔn)文件<stdlib.h>里描述,需要用這些功 
能時(shí)應(yīng)包含這個(gè)文件。與動(dòng)態(tài)存儲(chǔ)分配有關(guān)的函數(shù)共有四個(gè),其中就包括存儲(chǔ)分配函數(shù)malloc()。函數(shù)原型是:void *malloc (size_t n);這里的size_t是標(biāo)準(zhǔn)庫(kù)里定義的一個(gè)類型,它是一個(gè)無(wú)符號(hào)整型。這個(gè)整型能夠滿足所有對(duì)存儲(chǔ)塊大小描述的需要,具體相當(dāng)于哪個(gè)整型由具體的C系統(tǒng)確定。malloc的返回值為(void *)類型(這是通用指針的一個(gè)重要用途),它分配一片能存放大小為n的數(shù)據(jù)的存儲(chǔ)塊,返回對(duì)應(yīng)的指針值;如果不能滿足申請(qǐng)(找不到能滿足要求的存儲(chǔ)塊)就返回NULL。在使用時(shí),應(yīng)該把malloc的返回值轉(zhuǎn)換到特定指針類型,賦給一個(gè)指針。

  注意,雖然這里的存儲(chǔ)塊是通過(guò)動(dòng)態(tài)分配得到的,但是它的大小也是確定的,同樣不允許越界使用。例如上面程序段分配的塊里能存n個(gè)雙精度數(shù)據(jù),隨后的使用就必須在這個(gè)范圍內(nèi)進(jìn)行。越界使用動(dòng)態(tài)分配的存儲(chǔ)塊,尤其是越界賦值,可能引起非常嚴(yán)重的后果,通常會(huì)破壞程序的運(yùn)行系統(tǒng),可能造成本程序或者整個(gè)計(jì)算機(jī)系統(tǒng)垮臺(tái)。

  下例是一個(gè)動(dòng)態(tài)分配的例子:
  #include <stdlib.h>

  main()
  {
  int count,*array; /*count是一個(gè)計(jì)數(shù)器,array是一個(gè)整型指針,也可以理解為指向一個(gè)整型數(shù)組的首地址*/
  if((array(int *) malloc (10*sizeof(int)))==NULL)
  {
  printf("不能成功分配存儲(chǔ)空間。");
  exit(1);
  }
  for (count=0;count〈10;count++) /*給數(shù)組賦值*/
  array[count]=count;
  for(count=0;count〈10;count++) /*打印數(shù)組元素*/
  printf("%2d",array[count]);
  } 

  上例中動(dòng)態(tài)分配了10個(gè)整型存儲(chǔ)區(qū)域,然后進(jìn)行賦值并打印。例中if((array(int *) malloc (10*sizeof(int)))==NULL)語(yǔ)句可以分為以下幾步:
  1)分配10個(gè)整型的連續(xù)存儲(chǔ)空間,并返回一個(gè)指向其起始地址的整型指針
  2)把此整型指針地址賦給array
  3)檢測(cè)返回值是否為NULL

  3. malloc()工作機(jī)制

  malloc函數(shù)的實(shí)質(zhì)體現(xiàn)在,它有一個(gè)將可用的內(nèi)存塊連接為一個(gè)長(zhǎng)長(zhǎng)的列表的所謂空閑鏈表。調(diào)用malloc函數(shù)時(shí),它沿連接表尋找一個(gè)大到足以滿足用戶請(qǐng)求所需要的內(nèi)存塊。然后,將該內(nèi)存塊一分為二(一塊的大小與用戶請(qǐng)求的大小相等,另一塊的大小就是剩下的字節(jié))。接下來(lái),將分配給用戶的那塊內(nèi)存?zhèn)鹘o用戶,并將剩下的那塊(如果有的話)返回到連接表上。調(diào)用free函數(shù)時(shí),它將用戶釋放的內(nèi)存塊連接到空閑鏈上。到最后,空閑鏈會(huì)被切成很多的小內(nèi)存片段,如果這時(shí)用戶申請(qǐng)一個(gè)大的內(nèi)存片段,那么空閑鏈上可能沒(méi)有可以滿足用戶要求的片段了。于是,malloc函數(shù)請(qǐng)求延時(shí),并開(kāi)始在空閑鏈上翻箱倒柜地檢查各內(nèi)存片段,對(duì)它們進(jìn)行整理,將相鄰的小空閑塊合并成較大的內(nèi)存塊。

  4. malloc()在操作系統(tǒng)中的實(shí)現(xiàn)

  在 C 程序中,多次使用malloc () 和 free()。不過(guò),您可能沒(méi)有用一些時(shí)間去思考它們?cè)谀牟僮飨到y(tǒng)中是如何實(shí)現(xiàn)的。本節(jié)將向您展示 malloc 和 free 的一個(gè)最簡(jiǎn)化實(shí)現(xiàn)的代碼,來(lái)幫助說(shuō)明管理內(nèi)存時(shí)都涉及到了哪些事情。

  在大部分操作系統(tǒng)中,內(nèi)存分配由以下兩個(gè)簡(jiǎn)單的函數(shù)來(lái)處理:

  void *malloc (long numbytes):該函數(shù)負(fù)責(zé)分配 numbytes 大小的內(nèi)存,并返回指向第一個(gè)字節(jié)的指針。

  void free(void *firstbyte):如果給定一個(gè)由先前的 malloc 返回的指針,那么該函數(shù)會(huì)將分配的空間歸還給進(jìn)程的“空閑空間”。

  malloc_init 將是初始化內(nèi)存分配程序的函數(shù)。它要完成以下三件事:將分配程序標(biāo)識(shí)為已經(jīng)初始化,找到系統(tǒng)中最后一個(gè)有效內(nèi)存地址,然后建立起指向我們管理的內(nèi)存的指針。這三個(gè)變量都是全局變量:

  清單 1. 我們的簡(jiǎn)單分配程序的全局變量

  int has_initialized = 0;
  void *managed_memory_start;
  void *last_valid_address;


  如前所述,被映射的內(nèi)存的邊界(最后一個(gè)有效地址)常被稱為系統(tǒng)中斷點(diǎn)或者 當(dāng)前中斷點(diǎn)。在很多 UNIX? 系統(tǒng)中,為了指出當(dāng)前系統(tǒng)中斷點(diǎn),必須使用 sbrk(0) 函數(shù)。 sbrk 根據(jù)參數(shù)中給出的字節(jié)數(shù)移動(dòng)當(dāng)前系統(tǒng)中斷點(diǎn),然后返回新的系統(tǒng)中斷點(diǎn)。使用參數(shù) 0 只是返回當(dāng)前中斷點(diǎn)。這里是我們的 malloc 初始化代碼,它將找到當(dāng)前中 
斷點(diǎn)并初始化我們的變量:


  清單 2. 分配程序初始化函數(shù)
  /* Include the sbrk function */

  #include 
  void malloc_init()
  {
  /* grab the last valid address from the OS */
  last_valid_address = sbrk(0);
  /* we don't have any memory to manage yet, so
  *just set the beginning to be last_valid_address
  */
  managed_memory_start = last_valid_address;
  /* Okay, we're initialized and ready to go */
  has_initialized = 1;
  }


  現(xiàn)在,為了完全地管理內(nèi)存,我們需要能夠追蹤要分配和回收哪些內(nèi)存。在對(duì)內(nèi)存塊進(jìn)行了 free 調(diào)用之后,我們需要做的是諸如將它們標(biāo)記為未被使用的等事情,并且,在調(diào)用 malloc 時(shí),我們要能夠定位未被使用的內(nèi)存塊。因此, malloc 返回的每塊內(nèi)存的起始處首先要有這個(gè)結(jié)構(gòu):


  清單 3. 內(nèi)存控制塊結(jié)構(gòu)定義
  struct mem_control_block {
  int is_available;
  int size;
  };


  現(xiàn)在,您可能會(huì)認(rèn)為當(dāng)程序調(diào)用 malloc 時(shí)這會(huì)引發(fā)問(wèn)題 —— 它們?nèi)绾沃肋@個(gè)結(jié)構(gòu)?答案是它們不必知道;在返回指針之前,我們會(huì)將其移動(dòng)到這個(gè)結(jié)構(gòu)之后,把它隱藏起來(lái)。這使得返回的指針指向沒(méi)有用于任何其他用途的內(nèi)存。那樣,從調(diào)用程序的角度來(lái)看,它們所得到的全部是空閑的、開(kāi)放的內(nèi)存。然后,當(dāng)通過(guò) free() 將該指針傳遞回來(lái)時(shí),我們只需要倒退幾個(gè)內(nèi)存字節(jié)就可以再次找到這個(gè)結(jié)構(gòu)。


  在討論分配內(nèi)存之前,我們將先討論釋放,因?yàn)樗?jiǎn)單。為了釋放內(nèi)存,我們必須要做的惟一一件事情就是,獲得我們給出的指針,回退 sizeof(struct mem_control_block) 個(gè)字節(jié),并將其標(biāo)記為可用的。這里是對(duì)應(yīng)的代碼:


  清單 4. 解除分配函數(shù)
  void free(void *firstbyte) {
  struct mem_control_block *mcb;
  /* Backup from the given pointer to find the
  * mem_control_block
  */
  mcb = firstbyte - sizeof(struct mem_control_block);
  /* Mark the block as being available */
  mcb->is_available = 1;
  /* That's It!  We're done. */
  return;
  }


  如您所見(jiàn),在這個(gè)分配程序中,內(nèi)存的釋放使用了一個(gè)非常簡(jiǎn)單的機(jī)制,在固定時(shí)間內(nèi)完成內(nèi)存釋放。分配內(nèi)存稍微困難一些。以下是該算法的略述:


  清單 5. 主分配程序的偽代碼
  1. If our allocator has not been initialized, initialize it.
  2. Add sizeof(struct mem_control_block) to the size requested.
  3. start at managed_memory_start
    4. Are we at last_valid address?
  5. If we are:
  A. We didn't find any existing space that was&nbs

下一篇: PLC、DCS、FCS三大控

上一篇: 索爾維全系列Solef?PV

美女网站一区二区_在线观看日韩毛片_成人在线视频首页_欧美精品一区二区三区久久久_国产精品亚洲一区二区三区在线_日本免费新一区视频_日本美女一区二区三区_精品亚洲成a人_久久不见久久见免费视频1_91首页免费视频_欧美一区二区在线看_91精品91久久久中77777_天堂蜜桃一区二区三区_av在线一区二区_欧美不卡一区二区_欧美影视一区二区三区


        欧美成人一区二区三区在线观看| 美媛馆国产精品一区二区| 亚洲在线观看免费视频| ...中文天堂在线一区| 国产精品国产三级国产aⅴ入口 | 日本网站在线观看一区二区三区| 亚洲第一福利一区| 美女视频黄频大全不卡视频在线播放| 日本午夜一本久久久综合| 国产永久精品大片wwwapp| 成人午夜短视频| 国产日韩欧美精品| 亚洲精品无人区| 7777精品伊人久久久大香线蕉完整版| 日韩亚洲欧美高清| 国产精品久久久一区麻豆最新章节| 亚洲老妇xxxxxx| 久久av中文字幕片| 99久久综合色| 日韩在线观看电影完整版高清免费| 欧美最猛性xxxxx直播| 欧美大黄免费观看| 亚洲美女淫视频| 国产在线精品一区二区夜色| 91久色国产| 日韩资源av在线| 欧美一区三区二区| 亚洲色图一区二区| 精品一区二区三区不卡| 国产精品一区二区免费| 91国偷自产一区二区开放时间 | 久久久午夜精品| 亚洲自拍偷拍网站| 国产a久久麻豆| 明星裸体视频一区二区| 欧美日韩国产首页在线观看| 国产亚洲va综合人人澡精品| 丝袜a∨在线一区二区三区不卡| 高清成人在线观看| 亚洲国产精品久久久久久女王| 欧美日韩高清一区二区不卡| 国产精品久久久久久久浪潮网站| 蜜桃精品在线观看| 国产欧美日韩伦理| 555夜色666亚洲国产免| 一区二区三区精品视频在线| 成人免费看黄yyy456| 亚洲精品在线视频观看| 国产欧美精品在线观看| 日韩高清欧美激情| 99国精产品一二二线| 午夜精品福利一区二区三区蜜桃| 欧美日本韩国一区二区三区视频 | 亚洲人123区| 精品国免费一区二区三区| 亚洲欧洲综合另类| 蜜桃传媒视频麻豆第一区免费观看 | 欧美一级一区二区| 精品一区二区三区免费视频| 一区二区日本| 一区视频二区视频| 国产亚洲视频系列| 久久成人免费网| 精品欧美国产| 精品久久久久久无| 毛片基地黄久久久久久天堂| 成人精品电影在线观看| 色偷偷久久一区二区三区| 最好看的中文字幕久久| 国产成人在线观看免费网站| 中文字幕剧情在线观看一区| 综合久久国产九一剧情麻豆| 91在线视频在线| 日韩一本二本av| 一区二区三区四区av| 99热最新在线| 2017欧美狠狠色| 国产成人免费网站| 在线不卡中文字幕| 亚洲va天堂va国产va久| 久久综合久久久| 国产精品毛片无遮挡高清| 91麻豆.com| 日韩一区二区三区视频在线| 精品午夜一区二区三区在线观看| 午夜视频久久久| 亚洲一区二区视频在线| 激情小说综合区| 国产亚洲欧美激情| 狠狠v欧美v日韩v亚洲ⅴ| 欧洲一区二区三区在线| 日本少妇一区二区| 一区二区三区国| 三级久久三级久久久| 亚洲国产婷婷香蕉久久久久久99| 欧美高清在线精品一区| 91免费视频网| 国产精品网站一区| 69堂成人精品视频免费| 欧美经典一区二区| 97免费高清电视剧观看| 久久九九99视频| 成人av男人的天堂| 中文字幕一区二区在线播放| 久久99精品久久久久子伦| 亚洲欧美日韩综合aⅴ视频| 欧美日韩中文国产一区发布| 亚洲一区二区三区免费视频| 一本色道久久综合亚洲二区三区| 日韩黄色免费网站| 欧美日本在线播放| 国产激情视频一区二区在线观看| 日韩欧美视频一区| 91在线观看污| 国产精品美女久久久久av爽李琼 | 999国产在线| 国产网站一区二区| 久久国产精品高清| 五月综合激情婷婷六月色窝| 欧美体内she精视频| 国产成人激情av| 欧美国产1区2区| 色女人综合av| 久草精品在线观看| 欧美videos大乳护士334| 国产精品区免费视频| 亚洲午夜精品在线| 3d成人h动漫网站入口| 成人精品一二区| 亚洲成人免费在线| 91精品国产综合久久久久久漫画 | 国产日韩精品推荐| 天天综合天天做天天综合| 欧美日韩久久不卡| 99久久国产免费免费| 亚洲成av人片一区二区三区| 欧美日韩精品一区二区三区四区 | 风间由美一区二区三区在线观看 | 国产精品一色哟哟哟| 国产目拍亚洲精品99久久精品| 蜜桃视频在线观看成人| 久久99国产精品麻豆| 国产亚洲短视频| 亚洲国产欧洲综合997久久| 国产成人一区二区精品非洲| 国产精品短视频| 欧美最猛性xxxxx直播| www.久久久| 蜜桃视频一区二区| 国产精品进线69影院| 欧美伊人久久久久久久久影院| 91色乱码一区二区三区| 日日噜噜夜夜狠狠视频欧美人| 日韩欧美色综合网站| 亚洲春色在线| 99国产精品视频免费观看| 亚洲一区二区在线播放相泽| 欧美mv和日韩mv国产网站| 亚洲精品一区国产精品| 91丝袜脚交足在线播放| 免费观看在线综合色| 国产精品久久久久9999吃药| 欧美军同video69gay| 日本一区不卡| 91美女片黄在线观看91美女| 日韩精品欧美成人高清一区二区| 久久在线免费观看| 欧洲日韩一区二区三区| 久久精品午夜一区二区福利| 高清不卡一区二区在线| 日韩电影在线一区二区三区| 国产精品色婷婷久久58| 日韩欧美一区二区视频| 一本大道久久a久久综合| 国产专区一区二区| 99久久久精品| 国产在线精品免费| 日日夜夜一区二区| 亚洲狠狠丁香婷婷综合久久久| 欧美mv和日韩mv的网站| 欧美三级一区二区| 亚洲国产精品一区二区第一页| 99国产超薄肉色丝袜交足的后果| 激情都市一区二区| 午夜视频一区二区| 国产精品夫妻自拍| 久久综合999| 欧美成人一区二区| 欧美精品丝袜中出| 在线观看成人免费视频| 亚洲电影网站| 午夜精品一区二区在线观看 | 精品国产一区二区三区不卡| 欧美日韩一区二区三区在线看| 小说区图片区图片区另类灬| 久久天堂国产精品| 国新精品乱码一区二区三区18| av一区二区在线看| 91精品网站| 99国产精品一区|