C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解
C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解
1.為什么使用動(dòng)態(tài)內(nèi)存分配
數(shù)組在使用的時(shí)候可能造成內(nèi)存浪費(fèi),使用動(dòng)態(tài)內(nèi)存分配可以解決這個(gè)問(wèn)題。
2. malloc和free
C函數(shù)庫(kù)提供了兩個(gè)函數(shù),malloc和free,分別用于執(zhí)行動(dòng)態(tài)內(nèi)存分配和釋放。
(1)void *malloc(size_t size);
malloc的參數(shù)就是需要分配的內(nèi)存字節(jié)數(shù)。malloc分配一塊連續(xù)的內(nèi)存。如果操作系統(tǒng)無(wú)法向malloc提供更多的內(nèi)存,malloc就返回一個(gè)NULL指針。
(2)void free(void *pointer);
free的參數(shù)要么是NULL,要么是一個(gè)先前從malloc、calloc或realloc返回的值。
3. calloc和realloc
(1)void *calloc(size_t num_elements,size_t element_size);
calloc也用于內(nèi)存分配。malloc和calloc之間的主要區(qū)別是后者在返回指向內(nèi)存的指針之前把它初始化為0。
(2)realloc(void *ptr,size_t new_size);
realloc函數(shù)用于修改一個(gè)原先已經(jīng)分配的內(nèi)存塊的大小。如果它用于擴(kuò)大一個(gè)內(nèi)存,那么這塊內(nèi)存原先的內(nèi)容依然保留,新增加的內(nèi)存添加到原先內(nèi)存塊的后面。如果它用于縮小一個(gè)內(nèi)存塊,該內(nèi)存塊尾部的部分內(nèi)存被拿掉,剩余部分內(nèi)存的原先內(nèi)容依然保留。
4. 使用動(dòng)態(tài)分配的內(nèi)存
(1)使用示例
int *pi; pi = malloc(25 * sizeof(int)); if(pi == NULL){ printf("out of memery\n"); exit(1); }
(2)使用間接訪問(wèn)
int *pi2,i; pi2 = pi; for(i = 0;i < 25;i += 1) *pi2++ = 0;
也可以使用下標(biāo)。
int i; for(i = 0;i < 25;i += 1) *pi[i] = 0;
5. 常見的動(dòng)態(tài)內(nèi)存錯(cuò)誤
常見的錯(cuò)誤有:對(duì)NULL指針進(jìn)行解引用操作、對(duì)分配的內(nèi)存進(jìn)行操作時(shí)越過(guò)邊界、釋放并非內(nèi)存分配的內(nèi)存、試圖釋放一塊動(dòng)態(tài)分配的內(nèi)存的一部分以及一塊動(dòng)態(tài)內(nèi)存釋放之后被繼續(xù)使用。
以上就是對(duì)C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配的資料講解,如有疑問(wèn)請(qǐng)大家留言或者到本站社區(qū)討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用
這篇文章主要介紹了對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08使用CMake構(gòu)建一個(gè)簡(jiǎn)單的C++項(xiàng)目的實(shí)現(xiàn)
CMake是一個(gè)跨平臺(tái)的自動(dòng)化構(gòu)建工具,可以用于構(gòu)建各種類型的項(xiàng)目,本文主要介紹了使用CMake構(gòu)建一個(gè)簡(jiǎn)單的C++項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Qt實(shí)現(xiàn)部件透明陰影效果與不規(guī)則窗體詳解
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)部件透明陰影效果與不規(guī)則窗體的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01C++?超詳細(xì)分析多態(tài)的原理與實(shí)現(xiàn)
這篇文章主要介紹了C++多態(tài)的原理與實(shí)現(xiàn),多態(tài)是一種面向?qū)ο蟮脑O(shè)計(jì)思路,本身和C++不是強(qiáng)綁定的,其他語(yǔ)言當(dāng)中一樣有多態(tài),只不過(guò)實(shí)現(xiàn)的方式可能有所不同。下面來(lái)一起了解更多詳細(xì)內(nèi)容吧2022-03-03C語(yǔ)言入門篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識(shí)符
本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家2021-08-08VCPKG安裝和使用教程(經(jīng)驗(yàn)總結(jié))
這篇文章主要介紹了VCPKG安裝和使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01QT實(shí)現(xiàn)自定義Http客戶端的示例代碼
這篇文章主要為大家詳細(xì)介紹了QT如何實(shí)現(xiàn)自定義Http客戶端的,可以實(shí)現(xiàn)支持get,post請(qǐng)求方式;支持連接超時(shí)處理;支持網(wǎng)絡(luò)錯(cuò)誤,嘗試重連等功能,感興趣的小伙伴可以學(xué)習(xí)一下2022-11-11C++通過(guò)自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法
這篇文章主要介紹了C++通過(guò)自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法,涉及C++針對(duì)數(shù)組的遍歷操作相關(guān)技巧,需要的朋友可以參考下2015-06-06