我講解一下c語言中動(dòng)態(tài)分配內(nèi)存的函數(shù)_第1頁
我講解一下c語言中動(dòng)態(tài)分配內(nèi)存的函數(shù)_第2頁
我講解一下c語言中動(dòng)態(tài)分配內(nèi)存的函數(shù)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、我講解一下 c語言中動(dòng)態(tài)分配內(nèi)存的函數(shù),可能有些初學(xué)c語言的人不免要問了:我們?yōu)槭裁匆ㄟ^函數(shù)來實(shí)現(xiàn)動(dòng)態(tài)分配內(nèi)存呢?系統(tǒng)難道不是會(huì)自動(dòng)分配內(nèi)存嗎?既然有人會(huì)問這樣的問題,那么我在這里好好的講解一下吧!首先讓我們熟悉一下計(jì)算機(jī)的內(nèi)存吧!在計(jì)算機(jī)的系統(tǒng)中有四個(gè)內(nèi)存區(qū)域:1)棧:在棧里面儲(chǔ)存一些我們定義的局部變量以及形參(形式參數(shù));2)字符常量區(qū):主要是儲(chǔ)存一些字符常量,比如:char 其中”cgat”就儲(chǔ)存在3)全局區(qū):在全局區(qū)里儲(chǔ)存一些全局變量和靜態(tài)變量;4)堆:堆主要是通過動(dòng)態(tài)分配的儲(chǔ)存空間,也就是我們接下需要講的動(dòng)態(tài)分配內(nèi)存空間。int ; 我們定義了一個(gè)指向 int類型的指針 p;p是用

2、來儲(chǔ)存一個(gè)地址的值的,我們之所以要為p并沒有讓這個(gè)變量指示一個(gè)確切 int類型變量的地址,所以我們就必須要讓它有方向!我們在剛剛接觸指針的時(shí)候遇到過這樣的情況,int p=&a;這種方法不是指針方向可指。int *p;p=malloc(n*sizeof(類型名稱;我們通過 malloc()函數(shù)為一個(gè)指針變量 p分配了地址,這樣我們從鍵盤上鍵入的值就這樣存儲(chǔ)在 p里面了,接下來我們就可以對這個(gè) p進(jìn)行具體的操作了,比如 scanf(“%s”,p)等等。當(dāng)我們對 p結(jié)束操作的時(shí)候還要釋放 p的內(nèi)存空間。為什么要釋放內(nèi)存空間呢?在上致了內(nèi)存的泄露了。同時(shí)當(dāng)我們使用 malloc()函數(shù)的時(shí)候還應(yīng)該注

3、意當(dāng)我們釋放完空間的時(shí)候還要將原先的指針變量賦予一個(gè) NULL,也就是賦予一個(gè)空指針,留著下次的時(shí)候|NULL一個(gè)空指針這樣會(huì)導(dǎo)致原先的指針變量成為了一個(gè)野指針!何謂野指針?野指針的,因此當(dāng)我們每次使用完 malloc()函數(shù)的時(shí)候都必須將指針賦予一個(gè)空指針!相對于malloc()函數(shù)就不需要我們賦予NULL了,這是因?yàn)樵诿看握{(diào)用完 calloc()函數(shù)的時(shí)候系統(tǒng)會(huì)自動(dòng)將原先的指針賦予一個(gè)空指“0”calloc()函數(shù)的原型是 void *calloc(countsizeof比如:p=(char*)calloc(,sizeof(char);我們?yōu)閜分配了指向char型指針的“4”個(gè)空間。除了

4、malloc()與calloc(),還有一個(gè)動(dòng)態(tài)分配空間的函數(shù)realloc()函數(shù),這個(gè)函數(shù)比前兩個(gè)函數(shù)分配更多的空間,原型:void *realloc(void *p,size_t);該函數(shù)有幾個(gè)作用:1)2)如果有足夠的空間來擴(kuò)充 p的內(nèi)存塊,則返回一個(gè)指向 p的指針;如果沒有足夠的空間來擴(kuò)充 p的內(nèi)存塊,則為 p從新分配 size的空間,并把原來的內(nèi)容復(fù)制給 p,指向p的開頭,同時(shí)釋放原來的空間,返回一個(gè)指向新內(nèi)存塊的指針;3) 如果 p=NULL,其作用于 malloc()相似;下面舉一個(gè)程序的例子:#define LONG 10#include#include#includemai

5、n()char *message,bufLONG;gets(buf);message=(char*)realloc(NULL,strlen(buf)+1);strcpy(message,buf);puts(message);gets(buf);message=(char*)realloc(message,(strlen(message)+strlen(buf)+1);strcat(message,buf);puts(message);return 0;目錄基本信息詳細(xì)釋義所謂動(dòng)態(tài)內(nèi)存分配 (Dynamic Memory Allocation) 就是指在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間

6、的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不象數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。例如我們定義一個(gè) float型數(shù)組: float score100;但是,在使用數(shù)組的時(shí)候,總有一個(gè)問題困擾著我們:數(shù)組應(yīng)該有多大?在很多的情況下,你并不能確定要使用多大的數(shù)組,比如上例,你可能并不知道我們要定義的這個(gè)數(shù)組到底有多大,那么你就要把數(shù)組定義得足夠大。這樣,你的程序在運(yùn)行時(shí)就申請了固定大小的你認(rèn)為足夠大的內(nèi)存空間。即使你知道你想利用的空間大小,但是如果因?yàn)槟撤N特殊原因空間利用的大小有增加或者減少,你又必須重新去修改程序,擴(kuò)大數(shù)組的存儲(chǔ)范

7、圍。這種分配固定大小的內(nèi)存分配方法稱之為靜態(tài)內(nèi)存分配。但是這種內(nèi)存分配的方法存在比較嚴(yán)重的缺陷,特別是處理某些問題時(shí):在大多數(shù)情況下會(huì)浪費(fèi)大量的內(nèi)存空間,在少數(shù)情況下,當(dāng)你定義的數(shù)組不夠大時(shí),可能引起下標(biāo)越界錯(cuò)誤,甚至導(dǎo)致嚴(yán)重后果。我們用動(dòng)態(tài)內(nèi)存分配就可以解決上面的問題 . 所謂動(dòng)態(tài)內(nèi)存分配就是指在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不象數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。從以上動(dòng)、靜態(tài)內(nèi)存分配比較可以知道動(dòng)態(tài)內(nèi)存分配相對于靜態(tài)內(nèi)存分配的特點(diǎn):2、分配的空間可以根據(jù)程序的需要擴(kuò)大或縮小。malloc函數(shù).malloc函數(shù)的原型為: void *malloc (unsigned int size) 其作用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論