以前都在C++中new一個記憶體空間,在C中,就得用另一函數malloc申請自己指定大小的記憶體空間,如果想動態申請記憶體空間可以使用relloc函數。
void *mallco(int size);
malloc 向系統申請分配指定size個位元組的記憶體空間。傳回型別是 void* 類型。void* 表示未確定類型的指標,可以強制轉換為任何其它類型的指標。
需要注意的是,
1、malloc 函數返回的是 void * 類型,定義的哪種類型的指標,必須強轉為此類型指標,比如 p = (int *) malloc (sizeof(int)*2);因為不能將 void* 賦值給 int * 類型變數,所以必須通過 (int *) 來將強制轉換。
2、函數的實參為 sizeof(int) ,用於指明一個整型資料需要的大小。如果你寫成:int* p = (int *) malloc (1);代碼也能通過編譯,但事實上只分配了1個位元組大小的記憶體空間,當你往裡頭存入一個整數,就會有3個位元組無家可歸,而直接“住進鄰居家”,在free的時候也會出現堆棧衝突的錯誤。
3、malloc是必須指定記憶體大小的空間,比如想分配50個int類型的空間:int* p = (int *) malloc ( sizeof(int) * 50 ); //分配可以放得下50個整數的記憶體空間。
malloc 也可以達到 new [] 的效果,但是malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。
void *realloc(void *mem_address, unsigned int newsize);
先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體地區,而後釋放原來mem_address所指記憶體地區,同時返回新分配的記憶體地區的首地址。即重新分配儲存空間塊的地址。他的作用就是重新申請記憶體空間,不影響原有資料,但是新分配的地址可能不一樣了。
需要注意的:
1、如果mem_address為null,則realloc()和malloc()類似。分配一個newsize的記憶體塊,返回一個指向該記憶體塊的指標。如果沒有足夠可用的記憶體用來完成重新分配(擴大原來的記憶體塊或者分配新的記憶體塊),則返回null而原來的記憶體塊保持不變。
2、如果有足夠空間用於擴大mem_address指向的記憶體塊,則分配額外記憶體,並返回mem_address這裡說的是“擴大”,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時, realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平。也就是說,如果原先的記憶體大小後面還有足夠的 空閑空間用來分配,加上原來的空間大小= newsize。得到的是一塊連續的記憶體。
3、如果原來記憶體大小沒有足夠的空間來分配,那麼就會從堆棧中另找一塊指定大小的記憶體,並把原來的記憶體空間的內容複寫歸來,返回心的mem_address指標,以前的被放回堆棧。