欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:動態(tài)內(nèi)存管理(C語言)

柚子快報(bào)激活碼778899分享:動態(tài)內(nèi)存管理(C語言)

http://yzkb.51969.com/

?????????無奮斗不青春!????????? ??????????????????????? ???????????????????????

————————————————————————————————

?動態(tài)內(nèi)存管理

?動態(tài)內(nèi)存分配?動態(tài)內(nèi)存的定義?為什么存在動態(tài)內(nèi)存分配

?動態(tài)內(nèi)存函數(shù)的介紹?malloc和free、calloc、realloc諾malloc諾free諾malloc 和 free 的實(shí)際用法:諾calloc諾realloc

?常見的動態(tài)內(nèi)存錯(cuò)誤?對NULL指針的解引用操作?對動態(tài)開辟空間的越界訪問?對非動態(tài)開辟的空間使用free函數(shù)?使用free釋放一塊動態(tài)開辟內(nèi)存的一部分?對同一塊動態(tài)內(nèi)存多次釋放?動態(tài)開辟內(nèi)存忘記釋放(內(nèi)存泄漏)

?動態(tài)內(nèi)存分配

?動態(tài)內(nèi)存的定義

在c語言中,編寫程序有時(shí)不能確定數(shù)組應(yīng)該定義為多大,因此這時(shí)在程序運(yùn)行時(shí)要根據(jù)需要從系統(tǒng)中動態(tài)多地獲得內(nèi)存空間。所謂動態(tài)內(nèi)存分配,就是指在程序執(zhí)行的過程中動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。

?為什么存在動態(tài)內(nèi)存分配

我們在平時(shí)經(jīng)常以固定的思維來思考問題,這樣也就會伴隨在我們寫代碼上,比如:我們在棧上創(chuàng)建空間:

int main()

{

int a[] = {1,2,3,4};

int b[10] = {1,2,3,4,5,6,7,8,9,10};

}

此時(shí)我們我們只知道b數(shù)組的空間是10個(gè),而a數(shù)組的空間我們沒有定義也并不知道,當(dāng)然有的人就會在這里死纏不放,說這個(gè)a里面不是有4個(gè)嗎,當(dāng)然這里a確實(shí)是有4個(gè),你能夠數(shù)出來那是因?yàn)樗@里是有限個(gè)數(shù)據(jù),我想說如果是無數(shù)個(gè)數(shù)據(jù)呢,所以在這里我只是舉個(gè)例子而已。

我們在初學(xué)下建立數(shù)組我們都會給它加上一個(gè)確定的空間大小,而等到后期熟練了,我們更常用的就是建議a數(shù)組這樣的情況,因?yàn)樵趯?shí)際情況中我們并不知道實(shí)際數(shù)據(jù)所占空間的大小,故才會存在不給數(shù)組定空間大小的情況。而這種情況就是我們今天提到的動態(tài)空間分配的情況。

有時(shí)候我們需要的空間大小在程序運(yùn)行的時(shí)候才能知道, 那數(shù)組的編譯時(shí)開辟空間的方式就不能滿足了。 這時(shí)候就只能試試動態(tài)存開辟了。

?動態(tài)內(nèi)存函數(shù)的介紹

?malloc和free、calloc、realloc

諾malloc

void* malloc (size_t size);

1、如果開辟成功,則返回一個(gè)指向開辟好空間的指針。 2、如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。 3、返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候使用者自己來決定。 4、如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。

這個(gè)函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針。

諾free

void free (void* ptr);

1、如果參數(shù) ptr 指向的空間不是動態(tài)開辟的,那free函數(shù)的行為是未定義的。 2、如果參數(shù) ptr 是NULL指針,則函數(shù)什么事都不做。

這個(gè)就是C語言中專門是用來做動態(tài)內(nèi)存的釋放和回收的。

free函數(shù)用來釋放動態(tài)開辟的內(nèi)存。

諾malloc 和 free 的實(shí)際用法:

malloc和free都聲明在 stdlib.h 頭文件中。

int main()

{

int *cur = (int *)malloc(sizeof(int)) ;

if(cur == NULL)

{

perror("malloc faild");

exit(-1);

}

free(cur);

cur = NULL;

return 0;

}

諾calloc

void* calloc (size_t num, size_t size);

1、函數(shù)的功能是為 num 個(gè)大小為 size 的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)初始化為0。 2、與函數(shù) malloc 的區(qū)別只在于 calloc 會在返回地址之前把申請的空間的每個(gè)字節(jié)初始化為全0。

如果我們對申請的內(nèi)存空間的內(nèi)容要求初始化,那么可以很方便的使用calloc函數(shù)來完成任務(wù)。

諾realloc

void* realloc (void* ptr, size_t size);

1、ptr 是要調(diào)整的內(nèi)存地址 2、size 調(diào)整之后新大小 3、返回值為調(diào)整之后的內(nèi)存起始位置。 4、這個(gè)函數(shù)調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會將原來內(nèi)存中的數(shù)據(jù)移動到新的空間。 5、realloc在調(diào)整內(nèi)存空間的是存在兩種情況:

第一種:原有的空間足夠大。 第二種:原有空間沒有那么大不滿足下一次空間的開辟。

針對realloc開辟空間的第二種情況,那就需要擴(kuò)容了。這個(gè)擴(kuò)容就需要在堆上進(jìn)行空間擴(kuò)充,擴(kuò)充的方法是:在堆空間上另找一個(gè)合適大小 的連續(xù)空間來使用。這樣函數(shù)返回的是一個(gè)新的內(nèi)存地址。 看下面的例子:

int main()

{

int *cur = (int*)malloc(sizeof(int));

if(cur == NULL)

{

perror("malloc faild");

exit(-1);

}

//如果此時(shí)cur的空間不足,然后進(jìn)行擴(kuò)容。

cur = (int*)realloc(cur, 100);

int *p = NULL ;

P = (int*)realloc(cur,100);

if(p!=NULL)

{

cur = p;

}

free(cur);//只要是動態(tài)開辟的空間,最后使用結(jié)束后都要進(jìn)行釋放。

return 0;

realloc和malloc、calloc的最大一個(gè)區(qū)別就是,realloc開辟的空間都會進(jìn)行初始化為0,而malloc和calloc只是開辟空間。所以這也就是我們在擴(kuò)容的時(shí)候都會用到realloc函數(shù),而它兩就主要用來開辟空間,常用的也就是malloc。

?常見的動態(tài)內(nèi)存錯(cuò)誤

?對NULL指針的解引用操作

int main()

{

//錯(cuò)誤版

int *cur = (int*)malloc(sizeof(int));

*cur = 1;

//如果cur為空就會發(fā)生錯(cuò)誤,此時(shí)需要對cur是否為空進(jìn)行判斷

//正確版

int *cur = (int*)malloc(sizeof(int));

if(cur == NULL)

{

perror("malloc faild");

exit(-1);

}

*cur = 1;//此時(shí)就是對的;

return 0;

}

?對動態(tài)開辟空間的越界訪問

int main()

{

int i = 0;

int *cur = (int*)malloc(10*sizeof(int));

//這里乘于10是開辟10個(gè)空間

if(cur == NULL)

{

perror("malloc faild");

exit(-1);

}

for(i = 0; i <= 10; i++)

{

*(cur+i);

//此時(shí)當(dāng)i=10的時(shí)候就會越界訪問,也就是i最大就是9,而不是10

}

free(cur);

return 0;

}

?對非動態(tài)開辟的空間使用free函數(shù)

int main()

{

int a = 10 ;

int *cur = &a;

free(cur);//由于cur指針使用的空間不是動態(tài)開辟的空間所以這里使用free是會報(bào)錯(cuò)

return 0;

}

?使用free釋放一塊動態(tài)開辟內(nèi)存的一部分

int main()

{

int *cur = (int*)malloc(sizeof(int));

{

perror("malloc faild");

exit(-1);

}

cur++;

free(cur);//此時(shí)cur指針并不是頭指針了,已經(jīng)移動過,所以釋放的空間并不是全部,還有空間沒釋放掉

return 0;

}

?對同一塊動態(tài)內(nèi)存多次釋放

int main()

{

int *cur = (int*)malloc(sizeof(int));

{

perror("malloc faild");

exit(-1);

}

free(cur);

free(cur);//前面已經(jīng)釋放過,再次釋放屬于錯(cuò)誤操作

return 0;

}

?動態(tài)開辟內(nèi)存忘記釋放(內(nèi)存泄漏)

int main()

{

int *cur = (int*)malloc(sizeof(int));

{

perror("malloc faild");

exit(-1);

}

*p = 10 ;

return 0;//還沒釋放動態(tài)開辟的空間,函數(shù)就結(jié)束,此時(shí)會有內(nèi)存泄漏的風(fēng)險(xiǎn)

}

忘記釋放不再使用的動態(tài)開辟的空間會造成內(nèi)存泄漏。 動態(tài)開辟的空間一定要釋放,并且正確釋放 。

本次的知識點(diǎn)就寫在這就結(jié)束了,如果有些地方出現(xiàn)錯(cuò)誤,請大家多多指正,我們一起進(jìn)步,相互學(xué)習(xí)。謝謝!謝謝!!謝謝!??!

柚子快報(bào)激活碼778899分享:動態(tài)內(nèi)存管理(C語言)

http://yzkb.51969.com/

好文推薦

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19523680.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄