動(dòng)態(tài)指針數(shù)組申請(qǐng)和釋放內(nèi)存_第1頁(yè)
動(dòng)態(tài)指針數(shù)組申請(qǐng)和釋放內(nèi)存_第2頁(yè)
動(dòng)態(tài)指針數(shù)組申請(qǐng)和釋放內(nèi)存_第3頁(yè)
動(dòng)態(tài)指針數(shù)組申請(qǐng)和釋放內(nèi)存_第4頁(yè)
動(dòng)態(tài)指針數(shù)組申請(qǐng)和釋放內(nèi)存_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、c語(yǔ)言中內(nèi)存的動(dòng)態(tài)分配與釋放(多維動(dòng)態(tài)數(shù)組構(gòu)建)(2012-02-29 00:17) 標(biāo)簽:c 語(yǔ)言內(nèi)存動(dòng)態(tài) 分類: C/C+靜態(tài)數(shù)組與動(dòng)態(tài)數(shù)組靜態(tài)數(shù)組比較常見(jiàn),數(shù)組長(zhǎng)度預(yù)先定義好,在整個(gè)程序中,一旦給定大小后就無(wú)法再改變長(zhǎng)度, 靜態(tài)數(shù)組自己自動(dòng)負(fù)責(zé)釋放占用的內(nèi)存。動(dòng)態(tài)數(shù)組長(zhǎng)度可以隨程序的需要而重新指定大小。動(dòng)態(tài)數(shù)組由內(nèi)存分配函數(shù)(malloc)從堆(heap) 上分配存儲(chǔ)空間,只有當(dāng)程序執(zhí)行了分配函數(shù)后,才為其分配內(nèi)存,同時(shí)由程序員自己負(fù)責(zé)釋放 分配的內(nèi)存(free)。為什么要使用動(dòng)態(tài)數(shù)組?在實(shí)際的編程中,往往會(huì)發(fā)生這種情況,即所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),而無(wú)法預(yù)先 確定。對(duì)于這種問(wèn)

2、題,用靜態(tài)數(shù)組的辦法很難解決。為了解決上述問(wèn)題,c語(yǔ)言提供了一些內(nèi)存 管理函數(shù),這些內(nèi)存管理函數(shù)結(jié)合指針可以按需要?jiǎng)討B(tài)地分配內(nèi)存空間,來(lái)構(gòu)建動(dòng)態(tài)數(shù)組,也可 把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。動(dòng)態(tài)數(shù)組與靜態(tài)數(shù)組的比較對(duì)于靜態(tài)數(shù)組,其創(chuàng)建非常方便,使用完也無(wú)需釋放,要引用也簡(jiǎn)單,但是創(chuàng)建后無(wú)法改變其大 小是其致命弱點(diǎn)!對(duì)于動(dòng)態(tài)數(shù)組,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則嚴(yán)重會(huì)引起內(nèi)存泄露。但其使 用非常靈活,能根據(jù)程序需要?jiǎng)討B(tài)分配大小。如何構(gòu)建動(dòng)態(tài)數(shù)組?構(gòu)建動(dòng)態(tài)數(shù)組時(shí),我們遵循下面的原則:申請(qǐng)的時(shí)候從外層往里層,逐層申請(qǐng);釋放的時(shí)候從里層往外層,逐層釋放;構(gòu)建動(dòng)態(tài)數(shù)組

3、所需指針對(duì)于構(gòu)建一維動(dòng)態(tài)數(shù)組,需要一維指針;對(duì)于二維,則需要一維,二維指針;對(duì)于三維,需要一,二,三維指針;依此類推。動(dòng)態(tài)內(nèi)存分配與釋放函數(shù)/*動(dòng)態(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);說(shuō)明:(1)malloc()函數(shù)成功:返回所開(kāi)辟空間首地址;失敗:返回空指針;功能:向系統(tǒng)申請(qǐng)size字節(jié)堆的空間;calloc ()成功:返回

4、所開(kāi)辟空間首地址;失敗:返回空指針;功能:按類型向系統(tǒng)申請(qǐng)num個(gè)size 字節(jié)堆的空間;realloc()成功:返回所開(kāi)辟空間首地址;失敗:返回空指針;功能:將p指向的空間變?yōu)閭€(gè)size 字節(jié)堆的空間;free()沒(méi)有返回值,釋放p指向的堆空間;(2)規(guī)定為void *類型,這并不是說(shuō)該函數(shù)調(diào)用后無(wú)返回值,而是返回一個(gè)結(jié)點(diǎn)的地址,該地址的 類型為void(無(wú)類型或類型不確定),即一段存儲(chǔ)區(qū)的首址,其具體類型無(wú)法確定,只有使用時(shí) 根據(jù)各個(gè)域值數(shù)據(jù)再確定??梢杂脧?qiáng)制轉(zhuǎn)換的方法將其轉(zhuǎn)換為別的類型。例如:double *pd = NULL;2- pd = (double *)calloc(10, s

5、izeof(double);表示將向系統(tǒng)申請(qǐng)10個(gè)連續(xù)的double類型的存儲(chǔ)空間,并用指針pd指向這個(gè)連續(xù)的空間的首 地址。并且用(double)對(duì)calloc ()的返回類型進(jìn)行轉(zhuǎn)換,以便把double類型數(shù)據(jù)的地址賦值給 指針pd。(3)使用sizeof的目的是用來(lái)計(jì)算一種類型的占有的字節(jié)數(shù),以便適合不同的編譯器。檢查動(dòng)態(tài)內(nèi)存是否分配成功由于動(dòng)態(tài)分配不一定成功,為此要附加一段異常處理程序,不致程序運(yùn)行停止,使用戶不知所措。通常采用這樣的異常處理程序段:if (p =NULL)/* 或者 if(!p)*/2. (printf (動(dòng)態(tài)申請(qǐng)內(nèi)存失敗! n);exit (1);/異常退出5. 這

6、四個(gè)函數(shù)頭文件均包含在stdlib.h中。分配的堆空間是沒(méi)有名字的,只能通過(guò)返回的指針找到它。絕不能對(duì)非動(dòng)態(tài)分配存儲(chǔ)塊使用free。也不能對(duì)同一塊內(nèi)存區(qū)同時(shí)用free釋放兩次,如:free(p);free(p); 調(diào)用free()時(shí),傳入指針指向的內(nèi)存被釋放,但調(diào)用函數(shù)的指針值可能保持不變,因?yàn)閜 是作為形參而傳遞給了函數(shù)。嚴(yán)格的講,被釋放的指針值是無(wú)效的,因?yàn)樗巡辉僦赶蛩暾?qǐng)的 內(nèi)存區(qū)。這時(shí)對(duì)它的任何使用便可能會(huì)可帶來(lái)問(wèn)題。所以在釋放一個(gè)指針指向的內(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ū)別,對(duì)于用malloc分配的內(nèi)存區(qū)間,如果原來(lái)沒(méi)有被使用過(guò),則其 中的每一位可能都是0;反之,如果這部分內(nèi)存空間曾經(jīng)被分配、釋放和重新分配,則其中可能 遺留各種各樣的數(shù)據(jù)。也就是說(shuō),使用malloc()函數(shù)的程序開(kāi)始時(shí)(內(nèi)存空間還沒(méi)有被重新分配) 能正常運(yùn)行,但經(jīng)過(guò)一段時(shí)間后(內(nèi)存空間已被重新分配)可能會(huì)出現(xiàn)問(wèn)題,因此在使用它之前必 須先進(jìn)行初始化(可用memset函數(shù)對(duì)其初始化為0),但調(diào)用calloc()函數(shù)分配到的空間在分 配時(shí)就已經(jīng)被初始化為0 了。當(dāng)

8、你在calloc()函數(shù)和malloc()函數(shù)之間作選擇時(shí),你需考慮是 否要初始化所分配的內(nèi)存空間,從而來(lái)選擇相應(yīng)的函數(shù)。六.動(dòng)態(tài)數(shù)組構(gòu)建過(guò)程以三維整型數(shù)組為例int arrayxyz先遵循從外到里,逐層申請(qǐng)的原則:最外層的指針就是數(shù)組名array,他是一個(gè)三維指針,指向的是array 口,array 是二維指針, 所以給array申請(qǐng)內(nèi)存空間需要一個(gè)三維指針int * p;1- /*給三維數(shù)組arrayxyz動(dòng)態(tài)分配內(nèi)存*/int* p =(int*)malloc(x * sizeof(int*);3- /*或者如下*/array = (int *)malloc(x * sizeof(int

9、 *)/*指針p指向的是array三維數(shù)組的第一維,有x個(gè)元素,所以要sizeof(x *(int*)*/次層指針是array口,它是一個(gè)二維指針,指向的是array口口,array口 口是一維指針:L int i, j;for (i = 0; i x; i+)(arrayi=(int*)malloc(y * sizeof(int*);最內(nèi)層指針是array口口,它是個(gè)一維指針,所指向的是array,其是個(gè)整型常量。所以給 array口 申請(qǐng)內(nèi)存應(yīng):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);綜合以上三步:/*動(dòng)態(tài)構(gòu)建三維數(shù)組內(nèi)存分配函數(shù)*/* pArr:指向三維數(shù)組首地址* x:三維數(shù)組第一維元素個(gè)數(shù)* y:三維數(shù)組第二維元素個(gè)數(shù)* Z:三維數(shù)組第三維元素個(gè)數(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ù)組構(gòu)建和釋放,這里

12、以構(gòu)建一個(gè)動(dòng)態(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 (輸入一維長(zhǎng)度:);scanf (d,&x);printf (輸入二維長(zhǎng)度:);scan

13、f (d,&y);printf (輸入三維長(zhǎng)度:);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功能:動(dòng)態(tài)構(gòu)建4維數(shù)組,學(xué)習(xí)動(dòng)態(tài)構(gòu)建多維數(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 (輸入一維長(zhǎng)度:);scanf (%d,&n1);puts (輸入二維長(zhǎng)度:);scanf (%d,&n2);puts(輸入三維長(zhǎng)度:);scanf (d,&n3);puts( 輸入四維長(zhǎng)度:);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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論