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