2 C中記憶體配置
A malloc
:原型為void* malloc(size_t size);在記憶體中的動態儲存裝置區中分配一個長度為size的空間,返回指向大小為size的記憶體地區首地址的void指標;使用者必須決定對象的長度,即申請空間的大小。同時,malloc只是分配了一塊傳回值為void*的記憶體而不是產生一個對象。由於malloc傳回值的類型是void*,所以在調用malloc時要顯式地進行類型轉換,將void* 轉換成所需要的指標類型,malloc函數本身並不識別要申請的記憶體是什麼類型,它只關心記憶體的總位元組數,因此使用sizeof是很好的方式,例如:int* p = (int*) malloc(sizeof(int) * length);使用malloc所分配的是一塊連續的記憶體,同時由於編譯器的實現問題(比如邊界對齊等),其所分配的記憶體可能比所請求的多一點。如果記憶體池為空白,或者可用記憶體不能滿足所請求的記憶體,則編譯器向作業系統請求,要求得到更多的記憶體,並在所得到的記憶體上執行分配任務。若作業系統無法向malloc提供更多的記憶體,那麼malloc返回一個NULL指標,因此有必要對malloc的返回指標進行檢查。
B realloc
:原型為void realloc(void* ptr, size_t sz);用於修改一個原先已經分配記憶體塊的大小,可以擴大也可以縮小。若擴大時,則保留原先的記憶體,將新添加的記憶體放於原先記憶體塊的後面,新記憶體並未以任何方式進行初始化;若縮小時,該記憶體塊尾部的部分記憶體釋放,其餘部分保留。注意:若realloc的第一個參數為NULL,那麼其行為與malloc一樣。另外如果原先的記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複寫到新塊上,因此在使用realloc之後就不能再使用指向原記憶體的指標,而應該改用realloc所返回的新指標。
C calloc
:原型為void* calloc(size_t elem_num, size_t elem_sz);與malloc的主要區別在於calloc在返回指向記憶體的指標之前把它初始化為0,另一個區別是他們請求記憶體數量的方式不通,calloc的參數包括所需元素的數量和每個元素的位元組數,由此它能夠計算出總共需要分配的記憶體。
D free
:原型為void free( void* p ); 由於指標p的類型以及它所指的記憶體的容量事先都是知道的,因此語句free(p)能正確地釋放記憶體。如果p是NULL指標,那麼free對p無論操作多少次都不會出問題。如果p不是NULL指標,那麼free對p連續操作兩次就會導致未定義的結果。
示範樣本:(需要寫出具有代表性的樣本)