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為接下來需要擴充容量的大小。
實例:
結果:
可從圖看出,擴容后地址和原先地址是不一樣的,但是這僅僅取決于擴容的內存大小。
實際上:
如果size較小,原來申請的動態內存后面還有空余內存,系統將直接在原內存空間后面擴容,并返回原動態空間基地址;如果size較大,原來申請的空間后面沒有足夠大的空間擴容,系統將重新申請一塊(20+size)*sizeof(int)的內存,并把原來空間的內容拷貝過去,原來空間free;如果size非常大,系統內存申請失敗,返回NULL,原來的內存不會釋放。注意:如果擴容后的內存空間較原空間小,將會出現數據丟失,如果直接realloc(p, 0);相當于free(p).
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的calloc、malloc、realloc函数的区别及用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSL详解!
- 下一篇: Linux中top命令的用法详解