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