1. 程式人生 > >動態記憶體分配的大家族之malloc calloc realloc free

動態記憶體分配的大家族之malloc calloc realloc free

        當我們在宣告陣列時,一般都會用一個常量去定義陣列的長度,但是陣列真正的長度在錄入資料時才知道的,那麼就會存在分配的陣列長度不夠或是長度太長造成浪費等問題,此時,我們就需要用到“動態記憶體分配”。在動態記憶體分配這個大家族中,有malloc(執行動態記憶體的分配),calloc,realloc,free(釋放記憶體)這些函式,那麼應該怎麼使用他們,使用時又該注意哪些問題呢?

malloc(stdlib.h)

malloc函式用於執行動態記憶體分配,當一個程式另外需要一些記憶體時,程式就呼叫malloc函式,malloc從記憶體池中提取一塊合適的記憶體(當然是根據需要算好的記憶體大小,malloc的引數就是需要分配的記憶體位元組數),並向該程式返回一個指向這塊記憶體的指標。由於malloc函式並不知道你的所要的記憶體將來是存整形,字元型,還是別的型別,所以malloc函式的返回值型別是void*.

注意

(1)malloc所分配的記憶體是沒有初始化的。

(2)malloc所分配的記憶體是一塊連續的記憶體。

(3)當malloc函式提取記憶體的時候,如果記憶體池為空或者說記憶體池的記憶體不夠,malloc函式就返回一個NULL指標,所以,對從malloc函式返回的指標都應該進行判斷看是不是為NULL,這是很重要的一個步驟。

free(stdlib.h)

free用於釋放記憶體,malloc得到記憶體並使用後,這個記憶體就不用了,free就來釋放這個記憶體,其實也就是把記憶體還給記憶體池。free引數要麼是NULL,要麼是從malloc返回的值。free雖然只做了這一個工作,但是它還是很重要的,如果你一直再用malloc向記憶體池要記憶體,卻沒有free,將會引起記憶體洩漏。在那些所有執行的程式共享一個通用記憶體池的作業系統中,記憶體洩漏會一點點的榨乾記憶體池,後果不堪設想。所以free還是很重要的,我認為free就是實現了''有借有還,再借不難''這句俗語。

calloc

calloc 也用於分配記憶體,不過他在返回指向記憶體的指標之前把他初始化為0.calloc的引數包括所需元素和每個元素的位元組數,它根據這些值來算所需記憶體的大小。

注意: 

calloc 在返回指向記憶體的指標之前把它初始化為0,這個會給我們帶來方便,但是如果你的程式只是想把一些值存到一個數組裡面,那麼這個初始化操作就屬於浪費時間,所以我們在記憶體分配的時候要判斷應該用malloc好還是calloc好。

realloc

realloc 函式用於修改一個原先已經分配好的記憶體塊的大小,用realloc函式可以使一塊記憶體放大或縮小。如果你要放大記憶體,則保留原來的記憶體塊不動,在其後直接追加記憶體塊;如果要縮小,該記憶體塊尾部的部分被拿掉,剩餘部分記憶體的原先內容依然保留;如果原先的記憶體塊無法改變大小,realloc 將分配一塊合適的記憶體塊,並把原來的那塊記憶體塊的內容複製到新的記憶體塊上。所以,在使用realloc後,就不能用指向舊記憶體的指標,而是改用realloc所返回的新指標。

另外,還需注意在動態記憶體分配時要檢查所請求的記憶體是否成功分配,操作記憶體的是不能超出分配記憶體的邊界。