在线免费观看成年人视频-在线免费观看国产-在线免费观看国产精品-在线免费观看黄网站-在线免费观看精品

產品分類

當前位置: 首頁 > 工業電氣產品 > 端子與連接器 > 汽車連接器

類型分類:
科普知識
數據分類:
汽車連接器

淺析malloc()的幾種實現方式

發布日期:2022-04-27 點擊率:140

    malloc()是C語言中動態存儲管理的一組標準庫函數之一。其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。 

  動態內存分配就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不像數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。本文簡單介紹動態內存分配函數malloc()及幾種實現方法。

  1. 簡介

  malloc()是C語言中動態存儲管理的一組標準庫函數之一。其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否為NULL并執行相應的操作。

  2. 函數說明

  C語言的動態存儲管理由一組標準庫函數實現,其原型在標準文件<stdlib.h>里描述,需要用這些功 
能時應包含這個文件。與動態存儲分配有關的函數共有四個,其中就包括存儲分配函數malloc()。函數原型是:void *malloc (size_t n);這里的size_t是標準庫里定義的一個類型,它是一個無符號整型。這個整型能夠滿足所有對存儲塊大小描述的需要,具體相當于哪個整型由具體的C系統確定。malloc的返回值為(void *)類型(這是通用指針的一個重要用途),它分配一片能存放大小為n的數據的存儲塊,返回對應的指針值;如果不能滿足申請(找不到能滿足要求的存儲塊)就返回NULL。在使用時,應該把malloc的返回值轉換到特定指針類型,賦給一個指針。

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

  下例是一個動態分配的例子:
  #include <stdlib.h>

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

  上例中動態分配了10個整型存儲區域,然后進行賦值并打印。例中if((array(int *) malloc (10*sizeof(int)))==NULL)語句可以分為以下幾步:
  1)分配10個整型的連續存儲空間,并返回一個指向其起始地址的整型指針
  2)把此整型指針地址賦給array
  3)檢測返回值是否為NULL

  3. malloc()工作機制

  malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然后,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存傳給用戶,并將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。到最后,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。于是,malloc函數請求延時,并開始在空閑鏈上翻箱倒柜地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合并成較大的內存塊。

  4. malloc()在操作系統中的實現

  在 C 程序中,多次使用malloc () 和 free()。不過,您可能沒有用一些時間去思考它們在您的操作系統中是如何實現的。本節將向您展示 malloc 和 free 的一個最簡化實現的代碼,來幫助說明管理內存時都涉及到了哪些事情。

  在大部分操作系統中,內存分配由以下兩個簡單的函數來處理:

  void *malloc (long numbytes):該函數負責分配 numbytes 大小的內存,并返回指向第一個字節的指針。

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

  malloc_init 將是初始化內存分配程序的函數。它要完成以下三件事:將分配程序標識為已經初始化,找到系統中最后一個有效內存地址,然后建立起指向我們管理的內存的指針。這三個變量都是全局變量:

  清單 1. 我們的簡單分配程序的全局變量

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


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


  清單 2. 分配程序初始化函數
  /* 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;
  }


  現在,為了完全地管理內存,我們需要能夠追蹤要分配和回收哪些內存。在對內存塊進行了 free 調用之后,我們需要做的是諸如將它們標記為未被使用的等事情,并且,在調用 malloc 時,我們要能夠定位未被使用的內存塊。因此, malloc 返回的每塊內存的起始處首先要有這個結構:


  清單 3. 內存控制塊結構定義
  struct mem_control_block {
  int is_available;
  int size;
  };


  現在,您可能會認為當程序調用 malloc 時這會引發問題 —— 它們如何知道這個結構?答案是它們不必知道;在返回指針之前,我們會將其移動到這個結構之后,把它隱藏起來。這使得返回的指針指向沒有用于任何其他用途的內存。那樣,從調用程序的角度來看,它們所得到的全部是空閑的、開放的內存。然后,當通過 free() 將該指針傳遞回來時,我們只需要倒退幾個內存字節就可以再次找到這個結構。


  在討論分配內存之前,我們將先討論釋放,因為它更簡單。為了釋放內存,我們必須要做的惟一一件事情就是,獲得我們給出的指針,回退 sizeof(struct mem_control_block) 個字節,并將其標記為可用的。這里是對應的代碼:


  清單 4. 解除分配函數
  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;
  }


  如您所見,在這個分配程序中,內存的釋放使用了一個非常簡單的機制,在固定時間內完成內存釋放。分配內存稍微困難一些。以下是該算法的略述:


  清單 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

CHINESE中国丰满熟妇| 又色又爽的无遮挡免费网址| 征服贵妇内射在线| 国产成人AV乱码免费观看| 久久九九久精品国产88| 日韩欧美亚洲国产精品字幕久久久| 亚洲成AV人在线观看网站| V与子敌伦刺激对白播放| 国内少妇BBWBBW黑森林| 人妻丰满熟妇AⅤ无码无码区免费 人妻丰满熟妇AⅤ无码区在线电影 | 人人爽人人爽人人爽人人片AV| 亚洲AV日韩精品久久久久| 把女的下面扒开添视频| 久久大香伊蕉在人线免费AV| 色欲AⅤ蜜臀AV在线播放| 一区二区在线视频| 国产精品99久久免费观看| 欧美另类VIDEOSSEXO潮| 亚洲国产一区二区三区在线观看 | 国产乱子夫妻XX黑人XYX真爽| 欧美疯狂性受XXXXX另类| 亚洲AV专区无码观看精品天堂| 被黑人伦流澡到高潮HNP动漫| 久久久久无码精品国产蜜桃| 无码人妻黑人中文字幕 | 久久伊人少妇熟女大香线蕉| 无码天堂亚洲国产AV久久| JULIA无码人妻中文字幕在线| 精品无人区麻豆乱码1区2区新区| 四虎国产精品永久在线| 97久久国产露脸精品国产| 精品无码三级在线观看视频| 挺进绝色老师的紧窄小肉| AAA日本高清在线播放免费观看| 精品久久久久久国产| 未满十八18禁止午夜免费网站| JEALOUSVUE成熟五十| 久久综合亚洲色1080P| 亚洲AV成人午夜电影在线观看| 成人亚洲综合AV天堂| 女教师娇喘潮喷抽搐在线视频| 亚洲精品亚洲人成在线观看| 国产精品V片在线观看不卡| 欧美最猛黑人XXXX黑人猛交98 | 女孩子手脚绑起来嘴用胶带封上| 亚洲精品国产综合麻豆久久99| 国产成人无码A区在线观看导航| 欧洲老妇做爰XXXⅩ性活电影| 一二三四免费观看在线中文版| 国产又爽又黄又爽又刺激| 视频一区二区三区免费| ぱらだいす天堂中文网.WWW| 麻花传媒剧国产MV在线看| 亚洲国产精品一区二区美利坚 | 国产精品看高国产精品不卡| 日产2021免费一二三四| 97人洗澡人人澡人人爽人人模| 久久久精品成人免费观看国产| 亚洲成A人片77777KKKK| 国产精品毛片无遮挡高清| 色五月五月丁香亚洲综合网| JAVASCRIPT的成熟分类| 免费人妻精品一区二区三区| 一本一道波多野毛片结衣AV黑人| 极品丰满熟妇人妻无码| 亚洲2022国产成人精品无码区| 国产成人麻豆精品午夜福利在线| 日韩精品无码AV成人观看| 八戒午夜理论片影院| 欧美人妻久久精品| 2021国内精品久久久久精品K| 麻豆传播媒体APP大全免费版 | 亚洲综合成人婷婷五月网址 | 精品人妻系列无码人妻免费视频| 亚洲Ⅴ国产V天堂A无码二区| 国产精品原创巨作AV女教师 | 极品人妻系列人妻30P| 性无码免费一区二区三区在线| 国产精品无码专区在线观看| 无码喷水一区二区浪潮AV| 国产FREEXXXX性播放麻豆| 少妇 黑人 欧美 亚洲| 嗯好爽快点插我视频在线播放| 日韩精品视频三区| 当着全班面被C到高潮哭视频 | 日本XXXXXXXXX69| ワンピースのエロ官网| 欧美人与动XXXXZ0OZ| ASSPICS亚洲美女裸体CH| 欧美夫妻免费拍拍片| av网站免费观看| 人妻少妇久久中文字幕| 成人毛片女18免费| 少妇被又大又粗又爽毛片久久黑人| 短乱俗小说500篇免费下载| 少妇短裙公车被直接进入| 囯产精品一品二区三区| 天天夜碰日日摸日日澡性色AV | 国产成人一区二区三区视频免费 | 一二三四视频中文字幕在线看| 老师露双奶头无遮挡挤奶视频| 16岁MACBOOKPRO日本| 欧美性BBBBBXXXXX4050免费看| А天堂中文在线官网在线| 日产一二三区别免费必看| 国产AV毛片1区2区3区| 无码人妻精一区二区三区| 国产午夜精品一区二区三区软件| 亚洲成AV人片在WWW鸭子| 久久国产乱子伦精品免费女人| 在线涩涩免费观看国产精品| 欧美黑人一级二级巨大久久天堂 | 人妻少妇一区二区| 大象1区一品精区搬运机器| 天天看高清影视在线观看| 国产无遮挡18禁无码网站| 亚洲人成无码WWW久久久| 久久夜色精品国产噜噜亚洲SV| 6080电影网站| 日韩无码视频一区| 国产强奷糟蹋漂亮邻居在线观看| 亚洲精品中文字幕无码专区| 乱码人妻一区二区三区| YW尤物爆乳网站点击进入| 特大巨黑吊性XXXX| 娇妻在厨房被朋友玩得呻吟| 在线亚洲专区高清中文字幕| 人曾交互MOUSE农场| 国产成人无码3000部| 亚洲国产AV一区二区三区丶| 美女扒开尿眼给男人桶爽网站免费| JLZZJLZZJLZ亚洲日本| 特级做A爰片毛片免费看| 护士高潮喷水白浆| 最新精品国偷自产在线下载| 日日噜噜噜夜夜爽爽狠狠| 国产在线精品一区二区三区| 曰本无码人妻丰满熟妇啪| 人人澡人人妻人人爽人人蜜桃| 国产精品无码AV片在线观看播放| 亚洲人妻AAA网站| 欧美一区在线视频| 国产精品免费看久久久无码| 亚洲综合久久无码色噜噜赖水| 欧美最猛黑人XXXX黑人猛交| 国产精品呻吟AV久久高潮| 亚洲中文字幕无码一区| 人妻久久久一区二区三区| 国产美女被遭强高潮免费网站 | 女性裸体无遮挡啪啪网站| 高清欧美性猛XXXX黑人| 亚洲欧美高清一区二区三区| 欧美丰满熟妇性XXXX| 国产裸体舞一区二区三区| 在线看片无码永久AV| 上司人妻互换HD无码| 久久成人国产精品免费软件| 把腿张开自慰给我看| 亚洲AV中文无码乱人伦在线R▽| 能让我流水水的一千字| 国产精品久久久久精品综合紧| 一面亲上边一面膜| 色综合色综合久久综合频道88 | 亚洲AV无码片VR一区二区三区| 妺妺窝人体色www在线观看婚闹| 国产成 人 黄 色 网 站 小说| 亚洲最大天堂无码精品区| 日韩无码一区视频| 久久精品亚洲熟妇少妇任你躁| 成人精品一卡2卡3卡4卡新区乱| 亚洲国产精品久久一线APP | 夫妇交换聚会群4P疯狂大战视频 | 奶头被客人玩的又红又肿| 国产精品国产精品偷麻豆| 制服 丝袜 有码 无码 中文| 天天做天天爱夭大综合网| 麻豆国产96在线 | 日韩| 国产精品国产三级在线专区 | 狠狠五月激情六月丁香| 拔萝卜视频免费观看高清下载| 亚洲国产精品久久人人爱| 日本肉体裸交XXXXBBBB| 久久精品国产亚洲7777| 国产AV激情久久无码天堂| 中文有码无码人妻在线短视频| 五月丁香合缴情在线看| 欧美成在线精品视频| 激情综合婷婷丁香五月情| 成人无码区免费AⅤ片WWW| 亚洲中字幕日产AV片在线| 天堂AV男人在线播放| 妺妺晚上扒我内裤玩我J| 国产一区内射最近更新| 成人国成人国产SUV| 在人间电影在线观看完整版 | 精品无码久久久久国产| 多毛小姐BGMBGMBGM| 19岁MACBOOKPRO高清| 亚洲国产精品久久久久蜜桃网站| 三级4级全黄60分钟|