摘要:函數(shù)和函數(shù)不同之處在于,函數(shù)會將所申請到的內(nèi)存空間全部初始化成,而函數(shù)則不會,這就意味著比運行時間更長,所以在選擇這兩個函數(shù)時可以根據(jù)是否需要初始化來選擇。切斷和已經(jīng)釋放的內(nèi)存空間的聯(lián)系。
目錄:動態(tài)函數(shù)的介紹:malloc? free? calloc? realloc
? ? ? ? ?三、?calloc函數(shù)
? ? ? ??calloc函數(shù)介紹:
? ? ? ??calloc的使用例子:
? ? ? ??realloc函數(shù)的使用例子
函數(shù)的參數(shù)形式:? ?void* calloc(size_t num , size_t size )
??其中void*是一個可以接受任意類型的指針,size_t表示的是unsigned int(無符號整型)
num表示的是多少個元素,size表示的是一個元素的大小,單位是字節(jié)。
1.? calloc函數(shù)也是向內(nèi)存申請空間的,若是申請成功則會返回一個指向內(nèi)存首地址的指針,
若是申請失敗,則會返回一個NULL(空指針),所以使用該函數(shù)也是需要進行判斷是否為
非空指針,否則程序會出錯。
2.calloc函數(shù)和malloc函數(shù)不同之處在于,calloc函數(shù)會將所申請到的內(nèi)存空間全部
?初始化成0,而malloc函數(shù)則不會,這就意味著calloc比malloc運行時間更長,
所以在選擇這兩個函數(shù)時可以根據(jù)是否需要初始化來選擇。
#include#includeint main(){ int *ptr=(int*)calloc(10,sizeof(int));//用ptr指針來接受calloc返回的值,申請的空間是40字節(jié) if(ptr==NULL) { return 0;//如果沒申請成功則直接結(jié)束函數(shù)。 } else//為ptr非空的情況 { for(int i=0;i<10;i++) { int kc=*(prt+i)=i;//將所申請的空間賦值 printf("%d ",kc);//打印每個元素 } } free(ptr);//釋放所申請的內(nèi)存空間,如不則容易導(dǎo)致內(nèi)存泄漏 ptr=NULL; //ptr還是指向原來所申請的地址,free不會將指針變?yōu)榭?,為了安全手動變?yōu)镹ULL return 0;}
?函數(shù)的參數(shù)形式:void* realloc(void*ptr , size_t num);
?其中void*ptr是要被改變的指針指向的地址,size_t num是改變之后的大小,單位是字節(jié)
? 1.realloc是一個專門用來調(diào)整申請動態(tài)內(nèi)存的大小。(也是要和free函數(shù)配套使用)
? 2.若realloc要擴大申請的空間,如果原始空間后有位置可追加則就在原指針之后進行追加,
? ?如果不夠則另外找一塊新的空間來,并且把存在舊的內(nèi)存里的數(shù)據(jù)移動到新的內(nèi)存空間,
? ?并且釋放舊的內(nèi)存空間給操作系統(tǒng),返回一個指向新的內(nèi)存地址的指針。
? 3. realloc改變所申請空間的大小和上述函數(shù)類似,若申請失敗則返回一個空指針,所以
? ?? 要判斷所返回的值是否為非空,若為非空指針,則可以*ptr=*p。
? ?? (其中*ptr為舊的指針*p為新的指針)??
? ? ? 注:若是將空指針賦值給*ptr,則原始內(nèi)容地址將丟失(內(nèi)存泄漏)??
? ?4.realloc函數(shù)功能較強大還可以實現(xiàn)malloc函數(shù)的功能,如 void* realloc(NULL,size_t? size);
? ? ?? 就是只需對NULL進行追加即可,它等價于void* malloc(size_t? size);
#include#includeint main(){ int* ptr=(int*)calloc(5,sizeof(int));//申請了5個int類型的內(nèi)存,用ptr去接受返回來的指針 if(ptr!=NULL) { for(int i=0;i<5;i++) { int input= *(ptr+i)=i; printf("%d ",input); } } int*p=(int*)realloc(ptr,40);//原ptr申請為10個int類型 if(p==NULL)//這步判斷不可少 { return 0;//若申請失敗則直接退出函數(shù) } else { ptr=p;//將新地址賦給舊的地址 for(int i=5;i<10;i++) { int hi= *(ptr+i)=i; printf("%d ",hi); } } free(ptr);//釋放申請的內(nèi)存給操作系統(tǒng),這步必不可少。 ptr=NULL;//切斷ptr和已經(jīng)釋放的內(nèi)存空間的聯(lián)系。 return 0;}
祝愿各位小伙伴們學(xué)有所成?。。?!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119297.html
摘要:對于申請內(nèi)存失敗,的處理是返回空指針,而的處理是拋異常對于自定義類型,會調(diào)用其構(gòu)造析構(gòu)函數(shù),而不會。內(nèi)存泄漏并不是指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,因為設(shè)計錯誤,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費。 ...
摘要:棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。棧區(qū)主要存放運行函數(shù)而分配的局部變量函數(shù)參數(shù)返回數(shù)據(jù)返回地址等。 C語言動態(tài)內(nèi)存分配篇 目錄 一、為什么存在動態(tài)內(nèi)存管理/分配? ????????內(nèi)存的存儲形式劃分 二、動態(tài)內(nèi)存函數(shù)的介紹 ????????malloc ...
閱讀 3132·2021-11-15 18:14
閱讀 1785·2021-09-22 10:51
閱讀 3299·2021-09-09 09:34
閱讀 3515·2021-09-06 15:02
閱讀 1031·2021-09-01 11:40
閱讀 3194·2019-08-30 13:58
閱讀 2534·2019-08-30 11:04
閱讀 1088·2019-08-28 18:31