最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言內存的動態(tài)分配比較malloc和realloc的區(qū)別

 更新時間:2021年07月08日 14:19:25   作者:唐世光  
這篇文章主要介紹了C語言內存的動態(tài)分配比較malloc和realloc的區(qū)別,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是本文的詳細內容,需要的朋友可以參考下

C—動態(tài)內存分配之malloc與realloc的區(qū)別

在程序的執(zhí)行期間分配內存時,內存區(qū)域中的這個空間稱為堆(heap)。還有另一個內存區(qū)域,稱為棧(stack),其中的空間分配給函數的參數和本地變量。在執(zhí)行完該函數后,存儲參數和本地變量的內存空間就會釋放。堆中的內存是由程序員控制的。在分配堆上的內存時,由程序員跟蹤所分配的內存何時不再需要,并釋放這些空間,以便于以后重用它們。

     使用動態(tài)內存很明顯的好處就是:不需要預先分配存儲空間且分配的空間可以根據程序的需要擴大或縮小,這樣可以有效的使用內存空間。

malloc和free

     C函數庫中的malloc和free分別用于執(zhí)行動態(tài)內存分配和釋放。這兩個函數的原型如下所示,他們都在頭文件stdlib.h中聲明。

     void *malloc ( size_t size );

     void free ( void *pointer );

     malloc的作用是在內存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續(xù)存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否為NULL,確保非空之后再使用非常重要。malloc所分配的內存是一塊連續(xù)的空間。同時,malloc實際分配的內存空間可能會比你請求的多一點,但是這個行為只是由編譯器定義的。malloc不知道用戶所請求的內存需要存儲的數據類型,所以malloc返回一個void *的指針,它可以轉換為其它任何類型的指針。

     由于內存區(qū)域總是有限的,不能不限制地分配下去,而且一個程序要盡量節(jié)省資源,所以當所分配的內存區(qū)域不用時,就要釋放它,以便其它的變量或者程序使用。這時我們就要用到free函數。free的參數必須要么是NULL,要么是從malloc、relloc、calloc返回的值。作用是釋放之前返回的指針指向的內存空間,向free傳遞一個NULL參數不會產生任何效果。

calloc和realloc與malloc的區(qū)別

     calloc和realloc的原型如下:

     void *calloc ( size_t num_elements, size_t element_size );

     void *realloc (void *ptr, size_t new_size );

     calloc和malloc 主要的區(qū)別在于前者在返回內存的指針之前將它初始化為0,另外它們請求數量的方式不同。calloc的參數包括所需元素的數量和每個元素的字節(jié),根據這些值可以計算出總共需要分配的內存空間。

     realloc函數用于修改一個原先已經分配的內存塊的大小,可以使一塊內存的擴大或縮小。當起始空間的地址為空,即*ptr = NULL,則同malloc。當*ptr非空:若nuw_size < size,即縮小*ptr所指向的內存空間,該內存塊尾部的部分內存被拿掉,剩余部分內存的原先內容依然保留;若nuw_size > size,即擴大*ptr所指向的內存空間,如果原先的內存尾部有足夠的擴大空間,則直接在原先的內存塊尾部新增內存,如果原先的內存尾部空間不足,或原先的內存塊無法改變大小,realloc將重新分配另一塊nuw_size大小的內存,并把原先那塊內存的內容復制到新的內存塊上。因此,使用realloc后就應該改用realloc返回的新指針。

使用方法程序示例

int *ptr =NULL;
ptr = (int*)malloc(sizeof(int)*size);
if (*ptr == NULL)
{
    strerror(error);
    return;
}

     上例中動態(tài)分配了size個整型存儲區(qū)域。動態(tài)分配內存的步驟可細分為:分配size個整型的連續(xù)存儲空間,并返回一個指向其起始地址的整型指針把此整型指針地址賦給ptr, 檢測返回值是否為NULL。注意,類型轉換(int*)將函數返回的地址轉換成int類型的指針。這么做是因為malloc()是一般用途的函數,可為任何類型的數據分配內存。sizeof是一個運算符,它返回一個size_t類型的無符號整數,該整數是存儲它的參數需要的字節(jié)數。它把關鍵字如int或float等作為參數,返回存儲該類型的數據項所需的字節(jié)數。它的參數也可以是變量或數組名。把數組名作為參數時,sizeof返回存儲整個數組所需的字節(jié)數。前一個例子請求分配足以存儲size個int數據項的內存。以這種方式使用sizeof,可以根據不同的C編譯器為int類型的值自動調整所需的內存空間。

int *p1,*p2; 
p1 = (int*)malloc(size * sizeof(int));
p2=p1; 
……  
free(p1);  /*或者free(p2)*/

     給free函數傳遞其它的值很可能造成死機或其它災難性的后果。注意:這里重要的是指針的值,而不是用來申請動態(tài)內存的指針本身。

     malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函數的參數。malloc函數是對存儲區(qū)域進行分配的。 free函數是釋放已經不用的內存區(qū)域的。 所以由這兩個函數就可以實現(xiàn)對內存區(qū)域進行動態(tài)分配并進行簡單的管理了。

下面是使用動態(tài)分配的內存的基本規(guī)則:

  • 避免分配大量的小內存塊。分配堆上的內存有一些系統(tǒng)開銷,所以分配許多小的內存塊比分配幾個大內存塊的系統(tǒng)開銷大。
  • 僅在需要時分配內存。只要使用完堆上的內存塊,就釋放它。
  • 總是確保釋放已分配的內存。在編寫分配內存的代碼時,就要確定在代碼的什么地方釋放內存。
  • 在釋放內存之前,確保不會無意中覆蓋堆上分配的內存的地址,否則程序就會出現(xiàn)內存泄漏。在循環(huán)中分配內存時,要特別小心。

到此這篇關于C語言內存的動態(tài)分配比較malloc和realloc的區(qū)別的文章就介紹到這了,更多相關C語言比較malloc和realloc內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解C語言隨機數設置的三種方式(保姆級教程)

    詳解C語言隨機數設置的三種方式(保姆級教程)

    本篇文章將為大家介紹在C語言中設置隨機數的三大方法的使用,文中的示例代碼講解詳細,對我們學習C語言有一定的幫助,需要的可以參考一下
    2022-11-11
  • C語言實現(xiàn)撲克牌計算24點

    C語言實現(xiàn)撲克牌計算24點

    這篇文章主要為大家詳細介紹了C語言如何實現(xiàn)撲克牌計算24點,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 如何判斷一個整數的二進制中有多少個1

    如何判斷一個整數的二進制中有多少個1

    本篇文章是對如何判斷一個整數的二進制中有多少個1的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C語言初階之函數

    詳解C語言初階之函數

    這篇文章主要介紹了C語言中的初階函數,介紹了其相關概念,具有一定參考價值。需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-11-11
  • C語言 深入解讀數據結構之堆的實現(xiàn)

    C語言 深入解讀數據結構之堆的實現(xiàn)

    堆就是用數組實現(xiàn)的二叉樹,所以它沒有使用父指針或者子指針。堆根據“堆屬性”來排序,“堆屬性”決定了樹中節(jié)點的位置
    2021-11-11
  • C++中constexpr與函數參數轉發(fā)的操作方法

    C++中constexpr與函數參數轉發(fā)的操作方法

    constexpr是c++11引入的關鍵字,c++11的constexpr的函數中只是支持單句代碼,c++14限制放寬,可以在里邊寫循環(huán)及邏輯判斷等語句,本文探討關于constexpr的函數中參數的現(xiàn)象,以及如果參數是constexpr如何做轉發(fā),感興趣的朋友一起看看吧
    2024-02-02
  • 解析C++中多層派生時的構造函數及一些特殊形式

    解析C++中多層派生時的構造函數及一些特殊形式

    這篇文章主要介紹了解析C++中多層派生時的構造函數及一些特殊形式,特殊形式主要針對基類和子對象類型的構造函數內容,需要的朋友可以參考下
    2015-09-09
  • C/C++?Qt?MdiArea?多窗體組件應用教程

    C/C++?Qt?MdiArea?多窗體組件應用教程

    MDI窗體控件類似于畫布,該控件只具備展示窗體的功能,無法實現(xiàn)生成窗體,所以我們需要在項目中手動增加自定義的Dialog對話框,并對該對話框進行一定的定制,這篇文章主要介紹了C/C++?Qt?MdiArea?多窗體組件應用,需要的朋友可以參考下
    2021-12-12
  • OpenCV繪制正多邊形的方法

    OpenCV繪制正多邊形的方法

    這篇文章主要為大家詳細介紹了OpenCV繪制正多邊形的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Win32應用程序(SDK)設計原理詳解

    Win32應用程序(SDK)設計原理詳解

    這篇文章主要介紹了Win32應用程序(SDK)設計原理,對于理解win32應用程序運行原理有很大的幫助,需要的朋友可以參考下
    2014-08-08

最新評論

黄浦区| 柳江县| 余姚市| 高唐县| 葫芦岛市| 贺州市| 民县| 桦甸市| 吴堡县| 诏安县| 安西县| 乳山市| 会泽县| 青河县| 平顶山市| 阜平县| 宜黄县| 海口市| 大化| 阿拉善右旗| 仪征市| 黄冈市| 英德市| 定结县| 武山县| 宁蒗| 澜沧| 石景山区| 新民市| 包头市| 巴林左旗| 花莲市| 桃园市| 神池县| 黄大仙区| 绥棱县| 金山区| 松潘县| 通山县| 定襄县| 武冈市|