c malloc 头文件_C语言提高篇_malloc,realloc和calloc的区别
1.malloc()
在內存的動態存儲區中分配一塊長度為size字節的連續區域,參數size為需要內存空間的長度,返回該區域的首地址。
其函數原型為void *malloc(unsigned int size);其作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數的返回值是分配區域的起始地址,或者說,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用于任何數據對象。
關于該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標準規定,該函數返回為void型指針,因此必要時要進行類型轉換。它能向系統申請分配一個長度為num_bytes(或size)個字節的內存塊。
一般它需和free函數配對使用。free函數能釋放某個動態分配的地址,表明不再使用這塊動態分配的內存了,實現把之前動態申請的內存返還給系統。
2.calloc()
與malloc相似,參數sizeOfElement為申請地址的單位元素長度,numElements為元素個數,即在內存中申請numElements*sizeOfElement字節大小的連續地址空間.
void *calloc(size_t nmenb, size_t size);
calloc()函數為nmemb個元素的數組分配內存空間,其中,每個元素的長度都是size個字節。如果要求的空間無效,那么此函數返回指針。在分配了內存之后,calloc()函數會通過將所有位設置為0的方式進行初始化。比如,調用calloc()函數為n個整數的數組分配存儲空間,且保證所有整數初始化為0:
pi = calloc(n, sizeof(int));
因為calloc()函數會清空分配的內存,而malloc()函數不會,所以可以調用以“1”作為第一個實參的calloc()函數,為任何類型的數據項分配空間。比如:
struct point{ int x, y;} *pi;
pi = calloc(1, sizeof(struct point));
在執行此語句后,pi將指向一個結構體,且此結構體的成員x和y都會被設為0。
一般使用后要使用?free(起始地址的指針) 對內存進行釋放,不然內存申請過多會影響計算機的性能,以至于得重啟電腦。如果使用過后不清零,還可以使用該指針對該塊內存進行訪問。
頭文件:stdlib.h或malloc.h?
3. realloc()
給一個已經分配了地址的指針重新分配空間,參數ptr為原有的空間地址,newsize是重新申請的地址長度.
區別:
函數malloc不能初始化所分配的內存空間,而函數calloc能.如果由malloc()函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是0;反之,?如果這部分內存曾經被分配過,則其中可能遺留有各種各樣的數據.也就是說,使用malloc()函數的程序開始時(內存空間還沒有被重新分配)能正常進行,但經過一段時間(內存空間還已經被重新分配)可能會出現問題.
函數calloc()?會將所分配的內存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數類型的元素分配內存,那么這些元素將保證會被初始化為0;如果你是為指針類型的元素分配內存,那么這些元素通常會被初始化為空指針;如果你為實型數據分配內存,則這些元素會被初始化為浮點型的零.
函數malloc向系統申請分配指定size個字節的內存空間.返回類型是?void類型.void表示未確定類型的指針.C,C++規定,void*?類型可以強制轉換為任何其它類型的指針.
realloc可以對給定的指針所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有內存的中內容將保持不變.當然,對于縮小,則被縮小的那一部分的內容會丟失**.realloc并不保證調整后的內存空間和原來的內存空間保持同一內存地址.相反,realloc返回的指針很可能指向一個新的地址.
realloc是從堆上分配內存的.當擴大一塊內存空間時,realloc()試圖直接從堆上現存的數據后面的那些字節中獲得附加的字節,如果數據后面的字節不夠,那么就使用堆上第一個有足夠大小的自由塊,現存的數據然后就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的一個重要的信息就是數據可能被移動。
我們官方的QQ群1:281549832
我們官方的QQ群2:386393398
特別感謝網友的大力支持。
我們的開源團隊不斷擴大,希望大家快來一起加入我們吧。
在這里還是要謝謝大家的大力支持!
大家快來關注吧!
總結
以上是生活随笔為你收集整理的c malloc 头文件_C语言提高篇_malloc,realloc和calloc的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot访问静态页面404_
- 下一篇: max复制关键帧到不同的文件_彭占元|如