c語言函式庫中提供了malloc和free函式,允許使用者使用者呼叫以動態申請說需要的記憶體,給程式的設計帶來了很大的靈活性。
所謂動態分配,是指使用者可以在程式執行期間根據需要申請或釋放記憶體,大小也完全可控。動態分配不像陣列記憶體那樣需要預先分配空間,而是由系統根據程式需要動態分配,大小完全按照使用者的要求來,當使用完畢後,使用者還可釋放所申請的動態記憶體,由系統**,以備他用。
malloc和free是c標準庫中提供的兩個函式,用以動態申請和釋放記憶體,malloc()函式的基本呼叫格式為:
void *malloc( unsigned int size );
引數size是個無符號整型數,使用者由此控制申請記憶體的大小,執行成功時,系統會為程式開闢一塊大小為size個記憶體位元組的區域,並將該區域的首位址返回,使用者可利用該位址管理並使用該塊記憶體,如果申請失敗(比如記憶體大小不夠用),返回空指標null。
malloc()函式返回型別是void*,用其返回值對其他型別指標賦值時,必須進行顯式轉換。size僅僅是申請位元組的大小,並不管申請的記憶體塊中儲存的資料型別,因此,申請記憶體的長度須由程式設計師通過「長度×sizeof(型別)」的方式給出,舉例來說:
int* p=(int*) malloc(5* sizeof(int) );
free就是釋放記憶體,例如free(p)
除了malloc與free外,c語言標準庫函式還提供了calloc函式用以動態申請記憶體,和malloc函式以位元組為單位申請記憶體不同,calloc函式是以目標物件為單位分配的,目標物件可以是陣列,也可以是後面會講到的結構體等。
calloc函式的原型為:
void* calloc(size_t num, size_t size);
malloc()函式返回型別也是void*,需要強制轉換才能為其他型別的指標賦值。calloc需要兩個引數以指定申請記憶體塊的大小,一是物件佔據的記憶體位元組數size,二是物件的個數num。
size_t型別是無符號整型,在windows及lcc編譯環境下,其定義為:
typedef unsigned int size_t;
為已經分配的記憶體重新分配空間並複製內容
realloc()函式有兩個引數
已分配的記憶體位址
重新分配的位元組數
void *realloc( void *ptr, size_t size );
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...
動態記憶體分配
c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...