日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

calloc、malloc、realloc函数的区别及用法

發(fā)布時(shí)間:2025/6/15 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 calloc、malloc、realloc函数的区别及用法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? ? ? ? ? ? ? ? ? ? calloc、malloc、realloc函數(shù)的區(qū)別及用法!

三者都是分配內(nèi)存,都是stdlib.h庫(kù)里的函數(shù),但是也存在一些差異。

(1)malloc函數(shù)。其原型void *malloc(unsigned int num_bytes);
num_byte為要申請(qǐng)的空間大小,需要我們手動(dòng)的去計(jì)算,如int *p = (int *)malloc(20*sizeof(int)),如果編譯器默認(rèn)int為4字節(jié)存儲(chǔ)的話,那么計(jì)算結(jié)果是80Byte,一次申請(qǐng)一個(gè)80Byte的連續(xù)空間,并將空間基地址強(qiáng)制轉(zhuǎn)換為int類型,賦值給指針p,此時(shí)申請(qǐng)的內(nèi)存值是不確定的。

(2)calloc函數(shù),其原型void *calloc(size_t n, size_t size);
其比malloc函數(shù)多一個(gè)參數(shù),并不需要人為的計(jì)算空間的大小,比如如果他要申請(qǐng)20個(gè)int類型空間,會(huì)int *p = (int *)calloc(20, sizeof(int)),這樣就省去了人為空間計(jì)算的麻煩。但這并不是他們之間最重要的區(qū)別,malloc申請(qǐng)后空間的值是隨機(jī)的,并沒(méi)有進(jìn)行初始化,而calloc卻在申請(qǐng)后,對(duì)空間逐一進(jìn)行初始化,并設(shè)置值為0;

實(shí)例:

?? ?int *p = (int *)malloc(20*sizeof(int));int *pp = (int *)calloc(20, sizeof(int));int i;printf("malloc申請(qǐng)的空間值:\n\n");for ( i=0 ; i < 20; i++){printf("%d ", *p++);}printf("\n\n");printf("calloc申請(qǐng)的空間的值:\n\n");for ( i=0 ; i < 20; i++){printf("%d ", *pp++);}printf("\n");

結(jié)果:

很多人會(huì)疑問(wèn):既然calloc不需要計(jì)算空間并且可以直接初始化內(nèi)存避免錯(cuò)誤,那為什么不直接使用calloc函數(shù),那要malloc要什么用呢?
實(shí)際上,任何事物都有兩面性,有好的一面,必然存在不好的地方。這就是效率。calloc函數(shù)由于給每一個(gè)空間都要初始化值,那必然效率較malloc要低,并且現(xiàn)實(shí)世界,很多情況的空間申請(qǐng)是不需要初始值的,這也就是為什么許多初學(xué)者更多的接觸malloc函數(shù)的原因。

(3)realloc函數(shù)和上面兩個(gè)有本質(zhì)的區(qū)別,其原型void realloc(void *ptr, size_t new_Size)
用于對(duì)動(dòng)態(tài)內(nèi)存進(jìn)行擴(kuò)容(及已申請(qǐng)的動(dòng)態(tài)空間不夠使用,需要進(jìn)行空間擴(kuò)容操作),ptr為指向原來(lái)空間基址的指針, new_size為接下來(lái)需要擴(kuò)充容量的大小。
實(shí)例:

int main(void) {const int size = 2000;int *p = (int *)malloc(20*sizeof(int));int *pp = (int *)realloc(p, size*sizeof(int));printf("原來(lái)的p_Address:%x ? 擴(kuò)容后的pp_Address:%x \n\n", p, pp);return 0; }


結(jié)果:

可從圖看出,擴(kuò)容后地址和原先地址是不一樣的,但是這僅僅取決于擴(kuò)容的內(nèi)存大小。

實(shí)際上:

如果size較小,原來(lái)申請(qǐng)的動(dòng)態(tài)內(nèi)存后面還有空余內(nèi)存,系統(tǒng)將直接在原內(nèi)存空間后面擴(kuò)容,并返回原動(dòng)態(tài)空間基地址;如果size較大,原來(lái)申請(qǐng)的空間后面沒(méi)有足夠大的空間擴(kuò)容,系統(tǒng)將重新申請(qǐng)一塊(20+size)*sizeof(int)的內(nèi)存,并把原來(lái)空間的內(nèi)容拷貝過(guò)去,原來(lái)空間free;如果size非常大,系統(tǒng)內(nèi)存申請(qǐng)失敗,返回NULL,原來(lái)的內(nèi)存不會(huì)釋放。注意:如果擴(kuò)容后的內(nèi)存空間較原空間小,將會(huì)出現(xiàn)數(shù)據(jù)丟失,如果直接realloc(p, 0);相當(dāng)于free(p).

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的calloc、malloc、realloc函数的区别及用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。