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

下載本文檔

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

文檔簡介

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

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

3、所需指針對于構(gòu)建一維動態(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)用后無返回值,而是返回一個結(jié)點(diǎn)的地址,該地址的 類型為void(無類型或類型不確定),即一段存儲區(qū)的首址,其具體類型無法確定,只有使用時(shí) 根據(jù)各個域值數(shù)據(jù)再確定??梢杂脧?qiáng)制轉(zhuǎn)換的方法將其轉(zhuǎn)換為別的類型。例如:double *pd = NULL;2- pd = (double *)calloc(10, s

5、izeof(double);表示將向系統(tǒng)申請10個連續(xù)的double類型的存儲空間,并用指針pd指向這個連續(xù)的空間的首 地址。并且用(double)對calloc ()的返回類型進(jìn)行轉(zhuǎn)換,以便把double類型數(shù)據(jù)的地址賦值給 指針pd。(3)使用sizeof的目的是用來計(jì)算一種類型的占有的字節(jié)數(shù),以便適合不同的編譯器。檢查動態(tài)內(nèi)存是否分配成功由于動態(tài)分配不一定成功,為此要附加一段異常處理程序,不致程序運(yùn)行停止,使用戶不知所措。通常采用這樣的異常處理程序段: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ū)同時(shí)用free釋放兩次,如:free(p);free(p); 調(diào)用free()時(shí),傳入指針指向的內(nèi)存被釋放,但調(diào)用函數(shù)的指針值可能保持不變,因?yàn)閜 是作為形參而傳遞給了函數(shù)。嚴(yán)格的講,被釋放的指針值是無效的,因?yàn)樗巡辉僦赶蛩暾埖?內(nèi)存區(qū)。這時(shí)對它的任何使用便可能會可帶來問題。所以在釋放一個指針指向的內(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ù)的程序開始時(shí)(內(nèi)存空間還沒有被重新分配) 能正常運(yùn)行,但經(jīng)過一段時(shí)間后(內(nèi)存空間已被重新分配)可能會出現(xiàn)問題,因此在使用它之前必 須先進(jìn)行初始化(可用memset函數(shù)對其初始化為0),但調(diào)用calloc()函數(shù)分配到的空間在分 配時(shí)就已經(jīng)被初始化為0 了。當(dāng)

8、你在calloc()函數(shù)和malloc()函數(shù)之間作選擇時(shí),你需考慮是 否要初始化所分配的內(nèi)存空間,從而來選擇相應(yīng)的函數(shù)。六.動態(tài)數(shù)組構(gòu)建過程以三維整型數(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)存應(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);綜合以上三步:/*動態(tài)構(gòu)建三維數(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ù)組構(gòu)建和釋放,這里

12、以構(gòu)建一個動態(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)構(gòu)建4維數(shù)組,學(xué)習(xí)動態(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 (輸入一維長度:);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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論