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

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

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

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

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

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

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

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

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

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

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

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

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

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

【attention】

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

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

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

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

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

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

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

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

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

    區(qū)別:

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

  #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 

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

相關(guān)文章

  • 在Linux系統(tǒng)中查看目錄大小的方法小結(jié)

    在Linux系統(tǒng)中查看目錄大小的方法小結(jié)

    在 Linux 系統(tǒng)中,管理文件和目錄的磁盤空間使用情況是日常維護(hù)的一部分,特別是在數(shù)據(jù)密集型的應(yīng)用場(chǎng)景中,了解各個(gè)目錄和文件的大小至關(guān)重要,du(disk usage)命令是一個(gè)強(qiáng)大的工具,可以幫助我們獲取目錄及其子目錄的大小信息,需要的朋友可以參考下
    2024-11-11
  • ssh端口轉(zhuǎn)發(fā)是什么?有什么用?

    ssh端口轉(zhuǎn)發(fā)是什么?有什么用?

    大家好,本篇文章主要講的是ssh端口轉(zhuǎn)發(fā)是什么?有什么用?,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Linux磁盤擴(kuò)容lvm的使用詳解

    Linux磁盤擴(kuò)容lvm的使用詳解

    這篇文章主要介紹了Linux磁盤擴(kuò)容lvm的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 每天一個(gè)linux命令(61):wget命令詳解

    每天一個(gè)linux命令(61):wget命令詳解

    本篇文章主要介紹了wget命令,Linux系統(tǒng)中的wget是一個(gè)下載文件的工具,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-11-11
  • apache和IIS共享80端口解決辦法

    apache和IIS共享80端口解決辦法

    這篇文章主要介紹了使用apache代理功能和IIS共享80端口解決辦法,需要的朋友可以參考下
    2014-03-03
  • Linux服務(wù)器VPS的Windows?DD包詳細(xì)的制作教程

    Linux服務(wù)器VPS的Windows?DD包詳細(xì)的制作教程

    這里就說(shuō)下Windows?dd包的制作過(guò)程,雖然網(wǎng)上很多這樣的dd包,但對(duì)于一些來(lái)歷不明的,也會(huì)有點(diǎn)不放心,所以我們有時(shí)間的話可以自己定制一個(gè)
    2022-08-08
  • Linux YUM倉(cāng)庫(kù)及NFS共享服務(wù)方式

    Linux YUM倉(cāng)庫(kù)及NFS共享服務(wù)方式

    YUM(Yellowdog Updater Modified)是基于RPM包的軟件包管理器,專門用于解決軟件包的依賴關(guān)系,支持通過(guò)FTP、HTTP服務(wù)或本地目錄從集中的YUM軟件倉(cāng)庫(kù)獲取軟件包,YUM能夠自動(dòng)處理包依賴問(wèn)題,簡(jiǎn)化了軟件安裝和更新過(guò)程
    2024-09-09
  • Linux文件清空的五種方法總結(jié)分享

    Linux文件清空的五種方法總結(jié)分享

    這篇文章主要給大家總結(jié)了Linux文件清空的五種方法,其中包括使用重定向的方法、使用true命令重定向清空文件、使用cat/cp/dd命令及/dev/null設(shè)備來(lái)清空文件、使用echo命令清空文件以及使用truncate命令清空文件等方法,需要的朋友可以參考下。
    2017-03-03
  • Debian 9系統(tǒng)下修改默認(rèn)網(wǎng)卡為eth0的方法

    Debian 9系統(tǒng)下修改默認(rèn)網(wǎng)卡為eth0的方法

    這篇文章主要給大家介紹了在Debian 9系統(tǒng)下修改默認(rèn)網(wǎng)卡為eth0的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • Centos7備份文件時(shí)備份文件加入備件日期

    Centos7備份文件時(shí)備份文件加入備件日期

    這篇文章主要介紹了關(guān)于Centos7備份文件時(shí)備份文件加入備件日期,本文通過(guò)實(shí)例圖文的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

雷波县| 全州县| 甘谷县| 英山县| 八宿县| 永福县| 祁门县| 万山特区| 应城市| 黎城县| 南华县| 昌图县| 鄢陵县| 方山县| 鞍山市| 行唐县| 铜梁县| 平和县| 汝州市| 财经| 石棉县| 延边| 宁阳县| 买车| 澜沧| 筠连县| 德昌县| 光泽县| 哈尔滨市| 万源市| 桦南县| 高尔夫| 南川市| 玉环县| 商河县| 鞍山市| 安阳县| 张家川| 婺源县| 忻城县| 郑州市|