C語言動(dòng)態(tài)內(nèi)存函數(shù)詳解
動(dòng)態(tài)開辟空間的原因
靜態(tài)開辟空間是固定的,數(shù)組在申明的時(shí)候必須指定數(shù)組的長度,在編譯的時(shí)候分配內(nèi)存,但是我們?cè)趯?shí)際情況中對(duì)于內(nèi)存空間的需求,不僅僅是上述的情況,有時(shí)候我們需要的空間只有在運(yùn)行之后才能知道,所以需要開辟一個(gè)動(dòng)態(tài)內(nèi)存空間,滿足更多需求。
1、malloc函數(shù)
void* malloc (size_t size);
malloc函數(shù)是向內(nèi)存申請(qǐng)一塊連續(xù)的空間,并返回指向這塊空間的指針,如果開辟成功則指向開辟好的空間,如果開辟失敗,則返回NULL,所以在使用之前要對(duì)開辟的空間進(jìn)行一個(gè)判斷。malloc函數(shù)的返回值是void*,所以在具體使用的時(shí)候可以由我們來指定。
給一個(gè)int型數(shù)組開辟動(dòng)態(tài)空間
int *p=(int *)malloc(sizeof(int)*n);
(int *)給malloc強(qiáng)轉(zhuǎn)一下,之后我們給數(shù)組開辟空間,可以用sizeof(int)*n這樣我們就可以只改變n的大小。
我們也可以給一個(gè)結(jié)構(gòu)體開辟動(dòng)態(tài)空間
//假設(shè)結(jié)構(gòu)體名為student
student *ptr=(student *)malloc(sizeof(student));
2、free函數(shù)
void free (void* ptr);
當(dāng)我們給變量開辟了動(dòng)態(tài)空間后使用完需要進(jìn)行釋放,否則有可能會(huì)出現(xiàn)內(nèi)存泄漏的問題。
釋放的時(shí)候就是在使用完整個(gè)變量后free掉
free( p);
free(ptr);
我們將空間釋放后指針其實(shí)還指向的是原來的空間,只是內(nèi)部存儲(chǔ)的數(shù)據(jù)全部釋放了,所以為了防止形成野指針,我們要在free的后面講指針賦為空。
free( p);
p=NULL;
free(ptr);
ptr=NULL;
當(dāng)然釋放過的空間不能重復(fù)釋放
free( p);
free( p);
free( p);
這樣是會(huì)報(bào)錯(cuò)的,不能重復(fù)釋放一個(gè)已經(jīng)釋放的空間
但是下面這樣是可以的,將指針?biāo)傅牡刂纷優(yōu)榭?br /> free( p);
p=NULL;
free( p);
3、calloc函數(shù)
void* calloc (size_t num, size_t size)
calloc函數(shù)的功能是為num個(gè)大小為size的元素開辟一塊空間,它的作用和malloc相似,但是calloc與malloc函數(shù)不同之處在于,他可以在開辟空間的同時(shí)把空間的每個(gè)字節(jié)初始化為0。
用法和malloc函數(shù)一致
int *p=(int *)calloc(10,sizeod(int));
釋放的時(shí)候也與malloc函數(shù)一致
free( p);
p=NULL;
所以我們要對(duì)申請(qǐng)的內(nèi)存空間初始化時(shí),可以直接使用calloc函數(shù)
4、realloc函數(shù)
void* realloc (void* ptr, size_t size)
我們有時(shí)會(huì)發(fā)現(xiàn)之前申請(qǐng)的空間太大或者太小的不合適的時(shí)候,就可以利用realloc函數(shù)對(duì)動(dòng)態(tài)開辟的空間進(jìn)行調(diào)整,realloc函數(shù)的出現(xiàn)也讓動(dòng)態(tài)內(nèi)存管理更加的靈活。
int *p=(int *)malloc(sizeof(int)*10);
p=(int *)realloc(p,sizeof(int)*20);空間改大
p=(int *)realloc(p,sizeof(int)*5);空間改小
空間改大改小都是可以的
realloc函數(shù)的實(shí)質(zhì)其實(shí)是另外開辟一個(gè)更大或者更小的空間,將原來的數(shù)復(fù)制過去,復(fù)制過去之后再將原來的空間釋放掉,所以會(huì)保留原本的數(shù)據(jù)。
int *ptr=(int *)malloc(100); int *p=NULL; p=(int *)realloc(ptr,20); if (p != NULL) { ptr=p; } free(ptr); ptr=NULL;
在實(shí)際運(yùn)用時(shí)將新開辟的空間賦給一個(gè)新的變量可以更好地保護(hù)程序,因?yàn)槿绻碌目臻g開辟失敗了我們也不會(huì)將原本的空間丟失,還能將原本的空間保留。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- C語言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
- c語言重要的字符串與內(nèi)存函數(shù)
- C語言字符串函數(shù)與內(nèi)存函數(shù)精講
- C語言超詳細(xì)講解字符串函數(shù)和內(nèi)存函數(shù)
- C語言深入詳解四大內(nèi)存函數(shù)的使用
- C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
- 深入了解C語言中的字符串和內(nèi)存函數(shù)
- 深度解析三個(gè)常見的C語言內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的實(shí)現(xiàn)示例
- C語言內(nèi)存函數(shù)的具體使用
相關(guān)文章
C++實(shí)現(xiàn)職工工資管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單的職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03