亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言中 malloc,calloc,realloc的區(qū)別

 更新時間:2017年02月23日 14:36:14   投稿:lqh  
這篇文章主要介紹了C語言中 malloc、calloc、realloc的區(qū)別的相關(guān)資料,需要的朋友可以參考下

C語言中 malloc、calloc、realloc的區(qū)別

(1)C語言跟內(nèi)存分配方式

<1>從靜態(tài)存儲區(qū)域分配.

       內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在.例如全局變量、static變量.

<2>在棧上創(chuàng)建

       在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放.棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限.

<3>從堆上分配,亦稱動態(tài)內(nèi)存分配.

       程序在運行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負責在何時用free或delete釋放內(nèi)存.動態(tài)內(nèi)存的生存期由用戶決定,使用非常靈活,但問題也最多.

(2)C語言跟內(nèi)存申請相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等.

    <1>alloca是向棧申請內(nèi)存,因此無需釋放.
    <2>malloc分配的內(nèi)存是位于堆中的,并且沒有初始化內(nèi)存的內(nèi)容,因此基本上malloc之后,調(diào)用函數(shù)memset來初始化這部分的內(nèi)存空間.
    <3>calloc則將初始化這部分的內(nèi)存,設(shè)置為0.
    <4>realloc則對malloc申請的內(nèi)存進行大小的調(diào)整.
    <5>申請的內(nèi)存最終需要通過函數(shù)free來釋放.

    當程序運行過程中malloc了,但是沒有free的話,會造成內(nèi)存泄漏.一部分的內(nèi)存沒有被使用,但是由于沒有free,因此系統(tǒng)認為這部分內(nèi)存還在使用,造成不斷的向系統(tǒng)申請內(nèi)存,使得系統(tǒng)可用內(nèi)存不斷減少.但是內(nèi)存泄漏僅僅指程序在運行時,程序退出時,OS將回收所有的資源.因此,適當?shù)闹仄鹨幌鲁绦?有時候還是有點作用.

【attention】

    三個函數(shù)的申明分別是:

 void* malloc(unsigned size);
  void* realloc(void* ptr, unsigned newsize); 
  void* calloc(size_t numElements, size_t sizeOfElement); 

    都在stdlib.h函數(shù)庫內(nèi),它們的返回值都是請求系統(tǒng)分配的地址,如果請求失敗就返回NULL.

    (1)函數(shù)malloc()

        在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為size字節(jié)的連續(xù)區(qū)域,參數(shù)size為需要內(nèi)存空間的長度,返回該區(qū)域的首地址.

    (2)函數(shù)calloc()

        與malloc相似,參數(shù)sizeOfElement為申請地址的單位元素長度,numElements為元素個數(shù),即在內(nèi)存中申請numElements*sizeOfElement字節(jié)大小的連續(xù)地址空間.

    (3)函數(shù)realloc()

        給一個已經(jīng)分配了地址的指針重新分配空間,參數(shù)ptr為原有的空間地址,newsize是重新申請的地址長度.

    區(qū)別:

    (1)函數(shù)malloc不能初始化所分配的內(nèi)存空間,而函數(shù)calloc能.如果由malloc()函數(shù)分配的內(nèi)存空間原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分內(nèi)存曾經(jīng)被分配過,則其中可能遺留有各種各樣的數(shù)據(jù).也就是說,使用malloc()函數(shù)的程序開始時(內(nèi)存空間還沒有被重新分配)能正常進行,但經(jīng)過一段時間(內(nèi)存空間還已經(jīng)被重新分配)可能會出現(xiàn)問題.
    (2)函數(shù)calloc() 會將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數(shù)類型的元素分配內(nèi)存,那么這些元素將保證會被初始化為0;如果你是為指針類型的元素分配內(nèi)存,那么這些元素通常會被初始化為空指針;如果你為實型數(shù)據(jù)分配內(nèi)存,則這些元素會被初始化為浮點型的零.
    (3)函數(shù)malloc向系統(tǒng)申請分配指定size個字節(jié)的內(nèi)存空間.返回類型是 void*類型.void*表示未確定類型的指針.C,C++規(guī)定,void* 類型可以強制轉(zhuǎn)換為任何其它類型的指針.
    (4)realloc可以對給定的指針所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有內(nèi)存的中內(nèi)容將保持不變.當然,對于縮小,則被縮小的那一部分的內(nèi)容會丟失.realloc并不保證調(diào)整后的內(nèi)存空間和原來的內(nèi)存空間保持同一內(nèi)存地址.相反,realloc返回的指針很可能指向一個新的地址.
    (5)realloc是從堆上分配內(nèi)存的.當擴大一塊內(nèi)存空間時,realloc()試圖直接從堆上現(xiàn)存的數(shù)據(jù)后面的那些字節(jié)中獲得附加的字節(jié),如果能夠滿足,自然天下太平;如果數(shù)據(jù)后面的字節(jié)不夠,問題就出來了,那么就使用堆上第一個有足夠大小的自由塊,現(xiàn)存的數(shù)據(jù)然后就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的一個重要的信息就是數(shù)據(jù)可能被移動.

  #include <stdio.h> 
#include <malloc.h> 
 
int main(int argc, char* argv[]) 
{ 
 char *p,*q; 
 p = (char *)malloc(10); 
 q = p; 
 p = (char *)realloc(p,10); 
 printf("p=0x%x/n",p); 
 printf("q=0x%x/n",q); 
  
 return 0; 
} 
 輸出結(jié)果:realloc后,內(nèi)存地址不變 
   p=0x431a70 
   q=0x431a70 
 
 例2: 
   #include <stdio.h> 
#include <malloc.h> 
 
int main(int argc, char* argv[]) 
{ 
 char *p,*q; 
 p = (char *)malloc(10); 
 q = p; 
 p = (char *)realloc(p,1000); 
 printf("p=0x%x/n",p); 
 printf("q=0x%x/n",q); 
  
 return 0; 
} 
 輸出結(jié)果:realloc后,內(nèi)存地址發(fā)生了變化 
   p=0x351c0 
   q=0x431a70 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Linux配置VSFTP服務(wù)器的方法

    Linux配置VSFTP服務(wù)器的方法

    下面小編就為大家?guī)硪黄狶inux配置VSFTP服務(wù)器的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 等保測評:Centos超時退出問題

    等保測評:Centos超時退出問題

    等保測評主機測評中需要查詢主機的超時退出配置,具體在Centos中的話,主要有兩種方式可以實現(xiàn)超時退出的功能。文中給大家詳細介紹,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • Linux系統(tǒng)目錄大小通過du命令獲取實例

    Linux系統(tǒng)目錄大小通過du命令獲取實例

    在本篇文章里小編給大家整理的是一篇關(guān)于Linux系統(tǒng)目錄大小通過du命令獲取實例內(nèi)容,需要的朋友們可以參考學習下。
    2020-11-11
  • Linux操作系統(tǒng)安裝圖文配置教程詳細版

    Linux操作系統(tǒng)安裝圖文配置教程詳細版

    這篇文章主要為大家詳細介紹了Linux操作系統(tǒng)安裝圖文配置教程,幫助大家順利的安裝Linux操作系統(tǒng),感興趣的小伙伴們可以參考一下
    2016-09-09
  • Linux之定時任務(wù)Crond詳解

    Linux之定時任務(wù)Crond詳解

    本篇文章主要介紹了Linux之定時任務(wù)Crond詳解 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 使用 bind 設(shè)置 DNS 服務(wù)器的方法

    使用 bind 設(shè)置 DNS 服務(wù)器的方法

    Bind9是一個強大的Linux下開放源代碼的DNS服務(wù)器軟件,這篇文章主要介紹了使用 bind 設(shè)置 DNS 服務(wù)器的方法,需要的朋友可以參考下
    2020-03-03
  • 值得收藏的27個Linux文檔編輯命令

    值得收藏的27個Linux文檔編輯命令

    本文是小編給大家收藏整理的27個Linux文檔編輯命令,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • Ubuntu 20.04系統(tǒng)中安裝vncserver的方法步驟

    Ubuntu 20.04系統(tǒng)中安裝vncserver的方法步驟

    這篇文章主要介紹了Ubuntu 20.04系統(tǒng)中安裝vncserver的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Gzip在apache2中的設(shè)置和squid對它的處理

    Gzip在apache2中的設(shè)置和squid對它的處理

    gzip可以級大的加速網(wǎng)站.有時壓縮比率高到80%,近來測試了一下,最少都有40%以上,還是相當不錯的.在Apache2之后的版本,模塊名不叫g(shù)zip,而叫mod_deflate
    2011-12-12
  • CentOS Yum編譯安裝MySQL 5.6

    CentOS Yum編譯安裝MySQL 5.6

    這篇文章主要為大家詳細介紹了CentOS Yum編譯安裝MySQL 5.6,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論