c語(yǔ)言中malloc、realloc與calloc 的區(qū)別以及聯(lián)系
ANSI C說(shuō)明了三個(gè)用于存儲(chǔ)空間動(dòng)態(tài)分配的函數(shù)
(1) malloc分配指定字節(jié)數(shù)的存儲(chǔ)區(qū)。此存儲(chǔ)區(qū)中的初始值不確定
(2) calloc為指定長(zhǎng)度的對(duì)象,分配能容納其指定個(gè)數(shù)的存儲(chǔ)空間。該空間中的每一位(bit)都初始化為0
(3) realloc 更改以前分配區(qū)的長(zhǎng)度(增加或減少)。當(dāng)增加長(zhǎng)度時(shí),可能需將以前分配區(qū)的內(nèi)容移到另一個(gè)足夠大的區(qū)域,而新增區(qū)域內(nèi)的初始值則不確定
.分配函數(shù)時(shí)再分配 realloc()
使我們可以增、減以前分配區(qū)的長(zhǎng)度(最常見的用法是增加該區(qū))。
如果先分配一個(gè)可容納長(zhǎng)度為512的數(shù)組的空間,并在運(yùn)行時(shí)填充它,但又發(fā)現(xiàn)空間不夠,則可調(diào)用realloc擴(kuò)充該存儲(chǔ)空間。
如果在該存儲(chǔ)區(qū)后有足夠的空間可供擴(kuò)充,則可在原存儲(chǔ)區(qū)位置上向高地址方向擴(kuò)充,并返回傳送給它的同樣的指針值。
如果在原存儲(chǔ)區(qū)后沒有足夠的空間,則realloc分配另一個(gè)足夠大的存儲(chǔ)區(qū),將現(xiàn)存的5 1 2個(gè)元素?cái)?shù)組的內(nèi)容復(fù)制到新分配的存儲(chǔ)區(qū)。
因?yàn)檫@種存儲(chǔ)區(qū)可能會(huì)移動(dòng)位置,所以不應(yīng)當(dāng)使用任何指針指在該區(qū)中。
注意,realloc的最后一個(gè)參數(shù)是存儲(chǔ)區(qū)的newsize(新長(zhǎng)度),不是新、舊長(zhǎng)度之差。作為一個(gè)特例,若ptr是一個(gè)空指針,則realloc的功能與malloc相同,用于分配一個(gè)指定長(zhǎng)度newsize的存儲(chǔ)區(qū)。
這些分配例程通常通過(guò)sbrk(2)系統(tǒng)調(diào)用實(shí)現(xiàn)。該系統(tǒng)調(diào)用擴(kuò)充(或縮小)進(jìn)程的堆。雖然sbrk可以擴(kuò)充或縮小一個(gè)進(jìn)程的存儲(chǔ)空間,但是大多數(shù)malloc和free的實(shí)現(xiàn)都不減小進(jìn)程的存儲(chǔ)空間。釋放的空間可供以后再分配,但將它們保持在malloc池中而不返回給內(nèi)核。
應(yīng)當(dāng)注意的是,大多數(shù)實(shí)現(xiàn)所分配的存儲(chǔ)空間比所要求的要稍大一些,額外的空間用來(lái)記錄管理信息——分配塊的長(zhǎng)度,指向下一個(gè)分配塊的指針等等。這就意味著如果寫過(guò)一個(gè)已分配區(qū)的尾端,則會(huì)改寫后一塊的管理信息。這種類型的錯(cuò)誤是災(zāi)難性的,但是因?yàn)檫@種錯(cuò)誤不會(huì)很快就暴露出來(lái),所以也就很難發(fā)現(xiàn)。
將指向分配塊的指針向后移動(dòng)也可能會(huì)改寫本塊的管理信息。其他可能產(chǎn)生的致命性的錯(cuò)誤是:釋放一個(gè)已經(jīng)釋放了的塊;調(diào)用free時(shí)所用的指針不是三個(gè)alloc函數(shù)的返回值等。因?yàn)榇鎯?chǔ)器分配出錯(cuò)很難跟蹤,所以某些系統(tǒng)提供了這些函數(shù)的另一種實(shí)現(xiàn)方法。每次調(diào)用這三個(gè)分配函數(shù)中的任意一個(gè)或free時(shí)都進(jìn)行附加的出錯(cuò)檢驗(yàn)。在調(diào)用連接編輯程序時(shí)指定一個(gè)專用庫(kù),則在程序中就可使用這種版本的函數(shù)。此外還有公共可用的資源(例如由4.3+BSD所提供的),在對(duì)其進(jìn)行編譯時(shí)使用一個(gè)特殊標(biāo)志就會(huì)使附加的運(yùn)行時(shí)間檢查生效。
因?yàn)榇鎯?chǔ)空間分配程序的操作對(duì)某些應(yīng)用程序的運(yùn)行時(shí)間性能非常重要,所以某些系統(tǒng)提供了附加能力。例如,SVR4提供了名為mallopt的函數(shù),它使進(jìn)程可以設(shè)置一些變量,并用它們來(lái)控制存儲(chǔ)空間分配程序的操作。還可使用另一個(gè)名為mallinfo的函數(shù),以對(duì)存儲(chǔ)空間分配程序的操作進(jìn)行統(tǒng)計(jì)。請(qǐng)查看所使用系統(tǒng)的malloc(3)手冊(cè)頁(yè),弄清楚這些功能是否可用。
.alloca函數(shù)
還有一個(gè)函數(shù)也值得一提,這就是alloca。其調(diào)用序列與malloc相同,但是它是在當(dāng)前函數(shù)的棧幀上分配存儲(chǔ)空間,而不是在堆中。其優(yōu)點(diǎn)是:當(dāng)函數(shù)返回時(shí),自動(dòng)釋放它所使用的棧幀,所以不必再為釋放空間而費(fèi)心。其缺點(diǎn)是:某些系統(tǒng)在函數(shù)已被調(diào)用后不能增加棧幀長(zhǎng)度,于是也就不能支持alloca函數(shù)。盡管如此,很多軟件包還是使用alloca函數(shù),也有很多系統(tǒng)支持它。
欄 目:C語(yǔ)言
下一篇:解析linux 文件和目錄操作的相關(guān)函數(shù)
本文標(biāo)題:c語(yǔ)言中malloc、realloc與calloc 的區(qū)別以及聯(lián)系
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4271.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法