c語言的標準內存分配函數有:malloc,calloc,realloc,free等。
c++的內存分配和釋放函數爲new和delete。
下面對alloca、malloc、calloc、realloc等函數進行詳細說明。
alloca是向棧申請內存,無需進行釋放。
malloc分配的內存是位於堆中的,且沒有初始化內存中的內容,可以調用memset函數來初始化這部分的內存空間。
calloc會初始化所分配的內存,並且初始化爲0.
realloc函數對malloc申請的內存進行大小的調整。
三個函數的聲明分別爲:
void* malloc(unsigned size);
void* realloc(void* ptr,unsigned newsize);
void* calloc(size_t num,size_t size);
區別:
1、函數malloc不能初始化所分配的內存空間,而函數calloc能。如果由malloc()函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是0;
反之,如果這部分內存曾經被分配過,則其中可能遺留有曾經的數據。換句話說,使用malloc()函數的程序剛開始時(內存空間還沒有被重新分配)
能正常進行,但進過一段時間(內存空間已經被重新分配)可能會出現問題。
2、函數calloc會將所分配的內存空間都初始化爲0 ,也就是說,如果是給字符類型或者整數類型的元素分配內存,那麼這些元素會被初始化爲0;
如果是爲指針類型的元素分配內存,那這些元素會被初始化爲空指針;如果是爲實型數據分配內存,則這些元素會被初始化爲浮點型的零。
3、函數malloc向系統申請分配指定size個字節的內存空間。返回類型是 void*類型.void*表示未確定類型的指針.C,C++規定,void* 類型可以強制轉換爲任何其它類型的指針.
4、realloc可以對給定的指針所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有內存的中內容將保持不變.當然,對於縮小,則被縮小的那一部分的內容會丟失.realloc並不保證調整後的內存空間和原來的內存空間保持同一內存地址.相反,realloc返回的指針很可能指向一個新的地址.
5、realloc是從堆上分配內存的.當擴大一塊內存空間時,realloc()試圖直接從堆上現存的數據後面的那些字節中獲得附加的字節,如果能夠滿足,自然天下太平;如果數據後面的字節不夠,問題就出來了,那麼就使用堆上第一個有足夠大小的自由塊,現存的數據然後就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的一個重要的信息就是數據可能被移動.