日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 calloc、malloc、realloc函数的区别及用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? ? calloc、malloc、realloc函數的區別及用法!

三者都是分配內存,都是stdlib.h庫里的函數,但是也存在一些差異。

(1)malloc函數。其原型void *malloc(unsigned int num_bytes);
num_byte為要申請的空間大小,需要我們手動的去計算,如int *p = (int *)malloc(20*sizeof(int)),如果編譯器默認int為4字節存儲的話,那么計算結果是80Byte,一次申請一個80Byte的連續空間,并將空間基地址強制轉換為int類型,賦值給指針p,此時申請的內存值是不確定的。

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

實例:

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

結果:

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

(3)realloc函數和上面兩個有本質的區別,其原型void realloc(void *ptr, size_t new_Size)
用于對動態內存進行擴容(及已申請的動態空間不夠使用,需要進行空間擴容操作),ptr為指向原來空間基址的指針, new_size為接下來需要擴充容量的大小。
實例:

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


結果:

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

實際上:

如果size較小,原來申請的動態內存后面還有空余內存,系統將直接在原內存空間后面擴容,并返回原動態空間基地址;如果size較大,原來申請的空間后面沒有足夠大的空間擴容,系統將重新申請一塊(20+size)*sizeof(int)的內存,并把原來空間的內容拷貝過去,原來空間free;如果size非常大,系統內存申請失敗,返回NULL,原來的內存不會釋放。注意:如果擴容后的內存空間較原空間小,將會出現數據丟失,如果直接realloc(p, 0);相當于free(p).

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。