




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、c語言中內(nèi)存的動態(tài)分配與釋放(多維動態(tài)數(shù)組構建)(2012-02-29 00:17) 標簽:c 語言內(nèi)存動態(tài) 分類: C/C+靜態(tài)數(shù)組與動態(tài)數(shù)組靜態(tài)數(shù)組比較常見,數(shù)組長度預先定義好,在整個程序中,一旦給定大小后就無法再改變長度, 靜態(tài)數(shù)組自己自動負責釋放占用的內(nèi)存。動態(tài)數(shù)組長度可以隨程序的需要而重新指定大小。動態(tài)數(shù)組由內(nèi)存分配函數(shù)(malloc)從堆(heap) 上分配存儲空間,只有當程序執(zhí)行了分配函數(shù)后,才為其分配內(nèi)存,同時由程序員自己負責釋放 分配的內(nèi)存(free)。為什么要使用動態(tài)數(shù)組?在實際的編程中,往往會發(fā)生這種情況,即所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù),而無法預先 確定。對于這種問
2、題,用靜態(tài)數(shù)組的辦法很難解決。為了解決上述問題,c語言提供了一些內(nèi)存 管理函數(shù),這些內(nèi)存管理函數(shù)結合指針可以按需要動態(tài)地分配內(nèi)存空間,來構建動態(tài)數(shù)組,也可 把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。動態(tài)數(shù)組與靜態(tài)數(shù)組的比較對于靜態(tài)數(shù)組,其創(chuàng)建非常方便,使用完也無需釋放,要引用也簡單,但是創(chuàng)建后無法改變其大 小是其致命弱點!對于動態(tài)數(shù)組,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則嚴重會引起內(nèi)存泄露。但其使 用非常靈活,能根據(jù)程序需要動態(tài)分配大小。如何構建動態(tài)數(shù)組?構建動態(tài)數(shù)組時,我們遵循下面的原則:申請的時候從外層往里層,逐層申請;釋放的時候從里層往外層,逐層釋放;構建動態(tài)數(shù)組
3、所需指針對于構建一維動態(tài)數(shù)組,需要一維指針;對于二維,則需要一維,二維指針;對于三維,需要一,二,三維指針;依此類推。動態(tài)內(nèi)存分配與釋放函數(shù)/*動態(tài)內(nèi)存分配與釋放函數(shù)*/void *malloc(unsigned int size);void *calloc(unsigned int num, unsigned int size);void *realloc(void *p,unsigned int size);void free (void *p);說明:(1)malloc()函數(shù)成功:返回所開辟空間首地址;失敗:返回空指針;功能:向系統(tǒng)申請size字節(jié)堆的空間;calloc ()成功:返回
4、所開辟空間首地址;失敗:返回空指針;功能:按類型向系統(tǒng)申請num個size 字節(jié)堆的空間;realloc()成功:返回所開辟空間首地址;失敗:返回空指針;功能:將p指向的空間變?yōu)閭€size 字節(jié)堆的空間;free()沒有返回值,釋放p指向的堆空間;(2)規(guī)定為void *類型,這并不是說該函數(shù)調(diào)用后無返回值,而是返回一個結點的地址,該地址的 類型為void(無類型或類型不確定),即一段存儲區(qū)的首址,其具體類型無法確定,只有使用時 根據(jù)各個域值數(shù)據(jù)再確定??梢杂脧娭妻D換的方法將其轉換為別的類型。例如:double *pd = NULL;2- pd = (double *)calloc(10, s
5、izeof(double);表示將向系統(tǒng)申請10個連續(xù)的double類型的存儲空間,并用指針pd指向這個連續(xù)的空間的首 地址。并且用(double)對calloc ()的返回類型進行轉換,以便把double類型數(shù)據(jù)的地址賦值給 指針pd。(3)使用sizeof的目的是用來計算一種類型的占有的字節(jié)數(shù),以便適合不同的編譯器。檢查動態(tài)內(nèi)存是否分配成功由于動態(tài)分配不一定成功,為此要附加一段異常處理程序,不致程序運行停止,使用戶不知所措。通常采用這樣的異常處理程序段:if (p =NULL)/* 或者 if(!p)*/2. (printf (動態(tài)申請內(nèi)存失?。?n);exit (1);/異常退出5. 這
6、四個函數(shù)頭文件均包含在stdlib.h中。分配的堆空間是沒有名字的,只能通過返回的指針找到它。絕不能對非動態(tài)分配存儲塊使用free。也不能對同一塊內(nèi)存區(qū)同時用free釋放兩次,如:free(p);free(p); 調(diào)用free()時,傳入指針指向的內(nèi)存被釋放,但調(diào)用函數(shù)的指針值可能保持不變,因為p 是作為形參而傳遞給了函數(shù)。嚴格的講,被釋放的指針值是無效的,因為它已不再指向所申請的 內(nèi)存區(qū)。這時對它的任何使用便可能會可帶來問題。所以在釋放一個指針指向的內(nèi)存后,將該指 針賦值為0,避免該指針成為野指針:int*p =(int*)malloc(sizeof(int);free(p);/*釋放p指向
7、內(nèi)存*/p = 0;/*或者p =NULL,釋放p指向的內(nèi)存后,將p指針賦值為0,避免p指針成為野指針*/malloc與calloc的區(qū)別,對于用malloc分配的內(nèi)存區(qū)間,如果原來沒有被使用過,則其 中的每一位可能都是0;反之,如果這部分內(nèi)存空間曾經(jīng)被分配、釋放和重新分配,則其中可能 遺留各種各樣的數(shù)據(jù)。也就是說,使用malloc()函數(shù)的程序開始時(內(nèi)存空間還沒有被重新分配) 能正常運行,但經(jīng)過一段時間后(內(nèi)存空間已被重新分配)可能會出現(xiàn)問題,因此在使用它之前必 須先進行初始化(可用memset函數(shù)對其初始化為0),但調(diào)用calloc()函數(shù)分配到的空間在分 配時就已經(jīng)被初始化為0 了。當
8、你在calloc()函數(shù)和malloc()函數(shù)之間作選擇時,你需考慮是 否要初始化所分配的內(nèi)存空間,從而來選擇相應的函數(shù)。六.動態(tài)數(shù)組構建過程以三維整型數(shù)組為例int arrayxyz先遵循從外到里,逐層申請的原則:最外層的指針就是數(shù)組名array,他是一個三維指針,指向的是array 口,array 是二維指針, 所以給array申請內(nèi)存空間需要一個三維指針int * p;1- /*給三維數(shù)組arrayxyz動態(tài)分配內(nèi)存*/int* p =(int*)malloc(x * sizeof(int*);3- /*或者如下*/array = (int *)malloc(x * sizeof(int
9、 *)/*指針p指向的是array三維數(shù)組的第一維,有x個元素,所以要sizeof(x *(int*)*/次層指針是array口,它是一個二維指針,指向的是array口口,array口 口是一維指針:L int i, j;for (i = 0; i x; i+)(arrayi=(int*)malloc(y * sizeof(int*);最內(nèi)層指針是array口口,它是個一維指針,所指向的是array,其是個整型常量。所以給 array口 申請內(nèi)存應:L int i, j;for (i = 0; i x; i+) TOC o 1-5 h z (for(j = 0; j y; j+)(arrayi
10、j = (int*)malloc(z * sizeof(int);綜合以上三步:/*動態(tài)構建三維數(shù)組內(nèi)存分配函數(shù)*/* pArr:指向三維數(shù)組首地址* x:三維數(shù)組第一維元素個數(shù)* y:三維數(shù)組第二維元素個數(shù)* Z:三維數(shù)組第三維元素個數(shù)*/void Create3DActiveArray(int*pArr, int x, int y, int z)int i, j, k;pArr =(int*)malloc(x * sizeof(int*);12.for(i = 0; i x; i+) TOC o 1-5 h z pArri = (int*)malloc(y * sizeof(int*);f
11、or(j = 0; j y; j+)pArrij = (int*)malloc(z * sizeof(int);for (k = 0; k z; k+)pArrijk= i + j + k;內(nèi)存釋放函數(shù):void Free3DActiveArray(int*pArr, int x, int y)int i, j, k;for(i = 0; i x; i+)for(j = 0; j y; j+)free (pArrij);pArrij= 0;free (pArri);pArr i= 0;free(pArr);15./*2012 年 2 月 29 日 12:00:32目的:多維數(shù)組構建和釋放,這里
12、以構建一個動態(tài)3維數(shù)組為例*/5.#include #include 8.void Malloc3DActiveArray(int* pArr, int x, int y, int z);void Free3DActiveArray(int* pArr, int x, int y);/void Display3DArray(int* pArr, int x, int y, int z);12.13.int main(void)(16.int x, y, z;int*array=NULL;18.printf (輸入一維長度:);scanf (d,&x);printf (輸入二維長度:);scan
13、f (d,&y);printf (輸入三維長度:);scanf (d,&z);25.Malloc3DActiveArray(array, x, y, z);Free3DActiveArray(array, x, y);array=NULL;29.return 0;32.void Malloc3DActiveArray(int* pArr,int x,int y,int z)(int i, j, k;pArr =(int*) malloc (x * sizeof (int*);37.for(i = 0; i x; i+) TOC o 1-5 h z (pArri = (int*)malloc(y
14、 * sizeof(int*);for(j = 0; j y; j+)(pArrij = (int*)malloc(z * sizeof(int);for (k = 0; k z; k+)(pArr ijk= i + j + k + 1;printf(%d , pArr ijk); TOC o 1-5 h z printf (n);printf (n);54.void Free3DActiveArray(int* pArr, int x, int y)(int i, j;for(i = 0; i x; i+)(for(j = 0; j y; j+)(free(pArrij);pArr ij=
15、0;65.free (pArri);pArr i= 0;free(pArr);/*2012 年 2 月 29 日 12:32:02功能:動態(tài)構建4維數(shù)組,學習動態(tài)構建多維數(shù)組,并釋放多維數(shù)組*/5.#include #include 8.int main ()(11.int n1,n2,n3,n4;12.int*array;13.int i,j,k,m;14.puts (輸入一維長度:);scanf (%d,&n1);puts (輸入二維長度:);scanf (%d,&n2);puts(輸入三維長度:);scanf (d,&n3);puts( 輸入四維長度:);scanf (d,&n4);23
16、.array=(int*)malloc(n1 * sizeof(int*);/第一維25.for(i = 0; i n1; i+) TOC o 1-5 h z (arrayi = (int*)malloc(n2 * sizeof (int*);/第二維for(j = 0; j n2; j+)(arrayij = (int*)malloc(n3 * sizeof(int*);/第三維for (k = 0; k n3; k+)(arrayijk = (int*)malloc(n4 * sizeof(int);/第四維for(m = 0; m n4; m+)(arrayijkm= i + j + k + m + 1;printf (%dt, arrayijkm);printf (n);printf (n);printf (n);46.47.for(i=0;in1;i+)48. (49.for(j= 0;jn2;j+)50. (51. for (k= 0;kn3;k+) TOC o 1-5 h z (free(arrayijk);/釋放第四維指針arrayijk= 0;56.free(array
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年甘肅交通職業(yè)技術學院單招職業(yè)技能測試題庫完美版
- 2025年度學生安全教育與心理健康維護合同
- 2025年度勞動合同解除補償協(xié)議及員工福利待遇保障書
- 2025年度保險公司與國有企業(yè)單位全面合作協(xié)議
- 2025年度房屋租賃合同訂金及配套設施使用協(xié)議
- 2025年度摩托車進出口代理業(yè)務合同
- 2025年度公司股東內(nèi)部關于股權結構優(yōu)化與分配的協(xié)議書
- 2025年度委托招聘合同-行業(yè)領軍人才合作項目
- 2025年度員工向公司借款合同變更通知合同
- 2025年度工程車輛司機勞務派遣合同
- 《獸醫(yī)基礎》練習題及參考答案
- 2025年煤礦探放水證考試題庫
- 農(nóng)業(yè)機械設備運輸及調(diào)試方案
- 污水處理設備的故障處理指南考核試卷
- ps 課件教學課件
- 神經(jīng)外科患者早期康復護理
- 2025屆浙江省寧波市鎮(zhèn)海區(qū)鎮(zhèn)海中學高二物理第一學期期末考試試題含解析
- 口腔頜面部發(fā)育(口腔組織病理學課件)
- 機房設備搬遷及系統(tǒng)割接施工方案
- GB/T 44549-2024高溫條件下陶瓷材料界面黏結強度試驗方法
- 新疆2024年中考數(shù)學試卷(含答案)
評論
0/150
提交評論