1.使用動態內存的目標:
希望在程序執行的運行期間,可以動態的分配內存,由程序員手動的申請和釋放內存; -> 堆區2. malloc函數
2.1函數的原型
#include <stdlib.h>void *malloc(size_t size);
2.2函數的介紹
函數的參數爲要申請的內存大小,函數的返回值表示分配到內存的首地址,函數的功能就是申請一塊指定大小的動態內存;如果申請失敗,返回NULL,對於申請的內存不會進行初始化2.3 舉例
int* p = malloc(sizeof(int)); //C編譯能通過int* p = (int*)malloc(sizeof(int)); //C++檢查嚴格
if(p == NULL){ // 申請空間失敗}
int* q = (int*)malloc(5*sizeof(int));
char* str = (char*)malloc(sizeof(char));
struct Student* ps = (struct Student*)malloc(sizeof(struct Student));
3.calloc 函數
3.1 函數原型
void *calloc(size_t nmemb, size_t size);3.2 函數描述
函數用於申請nmemb個數據,每一個數據的大小是size的內存空間,申請失敗則返回NULL,申請到的內存做清零處理4. realloc函數
4.1 函數的原型
void *realloc(void *ptr, size_t size);4.2 函數的描述
第一個參數是原來內存的首地址,第二個參數是新空間的大小,
返回值是新申請內存的首地址,如果申請失敗,則返回NULL;
4.3 注意:
1)、如果新申請的內存空間比較大,多出來的內存空間不會被初始化,原來的數據不會改變2)、如果新申請的內存空間比較小,那麼可能造成數據的丟失
3)、先判斷當前的指針是否有足夠 的連續內存,如果有則擴大ptr指向的內存地址,並且將ptr返回,
如果空間不夠,先按照size指定的大小分配內存,將原來的數據拷貝到新內存區域中,釋放原來的內存空間,同時返回新申請內存的首地址、
4.4 特殊性
1)、第一個參數爲NULL,相當於malloc函數2)、第二個參數爲0,相當於free函數
5. free函數
內存泄露:如果申請的內存不去使用卻沒有釋放,這塊內存別的程序也無法使用5.1函數的原型:
void free(void *ptr);5.2函數的描述
函數的功能用於釋放ptr所指向的內存區域6.用途
1)、可以申請不定長的內存空間2)、可以不受作用域的限定