malloc,calloc,realloc函式區別

2021-06-21 15:07:38 字數 1712 閱讀 9642

ansi c

說明了三個用於儲存空間動態分配的函式

(1) malloc   分配指定位元組數的儲存區。此儲存區中的初始值不確定

(2) calloc   為指定長度的物件,分配能容納其指定個數的儲存空間。該空間中的每一位(bit)都初始化為0

(3) realloc  更改以前分配區的長度(增加或減少)。當增加長度時,可能需將以前分配區的內容移到另乙個足夠大的區域,而新增區域內的初始值則不確定

分配函式時再分配

realloc()

使我們可以增、減以前分配區的長度(最常見的用法是增加該區)。

如果先分配乙個可容納長度為512的陣列的空間,並在執行時填充它,但又發現空間不夠,則可呼叫realloc擴充該儲存空間。

如果在該儲存區後有足夠的空間可供擴充,則可在原儲存區位置上向高位址方向擴充,並返回傳送給它的同樣的指標值。

如果在原儲存區後沒有足夠的空間,則realloc分配另乙個足夠大的儲存區,將現存的5 1 2個元素陣列的內容複製到新分配的儲存區。

因為這種儲存區可能會移動位置,所以不應當使用任何指標指在該區中。

注意,realloc的最後乙個引數是儲存區的newsize(新長度),不是新、舊長度之差。作為乙個特例,若ptr是乙個空指標,則realloc的功能與malloc相同,用於分配乙個指定長度newsize的儲存區。

這些分配例程通常通過sbrk(2)系統呼叫實現。該系統呼叫擴充(或縮小)程序的堆。雖然sbrk可以擴充或縮小乙個程序的儲存空間,但是大多數 malloc和free的實現都不減小程序的儲存空間。釋放的空間可供以後再分配,但將它們保持在malloc池中而不返回給核心。

應當注意的是,大多數實現所分配的儲存空間比所要求的要稍大一些,額外的空間用來記錄管理資訊——分配塊的長度,指向下乙個分配塊的指標等等。這就意味著 如果寫過乙個已分配區的尾端,則會改寫後一塊的管理資訊。這種型別的錯誤是災難性的,但是因為這種錯誤不會很快就暴露出來,所以也就很難發現。

將指向分配塊的指標向後移動也可能會改寫本塊的管理資訊。其他可能產生的致命性的錯誤是:釋放乙個已經釋放了的塊;呼叫free時所用的指標不是三個 alloc函式的返回值等。因為儲存器分配出錯很難跟蹤,所以某些系統提供了這些函式的另一種實現方法。每次呼叫這三個分配函式中的任意乙個或free時 都進行附加的出錯檢驗。在呼叫連線編輯程式時指定乙個專用庫,則在程式中就可使用這種版本的函式。此外還有公共可用的資源(例如由4.3+bsd所提供 的),在對其進行編譯時使用乙個特殊標誌就會使附加的執行時間檢查生效。

因為儲存空間分配程式的操作對某些應用程式的執行時間效能非常重要,所以某些系統提供了附加能力。例如,svr4提供了名為mallopt的函式,它使進 程可以設定一些變數,並用它們來控制儲存空間分配程式的操作。還可使用另乙個名為mallinfo的函式,以對儲存空間分配程式的操作進行統計。請檢視所 使用系統的malloc(3)手冊頁,弄清楚這些功能是否可用。

alloca函式

還有乙個函式也值得一提,這就是alloca。其呼叫序列與malloc相同,但是它是在當前函式的棧幀上分配儲存空間,而不是在堆中。其優點是:當 函式返回時,自動釋放它所使用的棧幀,所以不必再為釋放空間而費心。其缺點是:某些系統在函式已被呼叫後不能增加棧幀長度,於是也就不能支援alloca 函式。儘管如此,很多軟體包還是使用alloca函式,也有很多系統支援它。

malloc,calloc,realloc用法小結

1 原型宣告 void malloc unsigned int size 向系統聲請分配size個位元組的記憶體空間 void calloc size t n,size t size 在記憶體的動態儲存區中分配n個長度為size的連續空間 void realloc void ptr,unsigned...

malloc calloc realloc之間區別

1.malloc函式 malloc函式可以從堆上獲得指定位元組的記憶體空間,其函式宣告如下 void malloc int n 引數釋義 n 申請空間大小 單個型別大小 總個數 2.calloc函式 calloc函式的功能與malloc函式的功能相似,都是從堆分配記憶體。其函式宣告如下 void c...

啟用函式sigmoid tanh relu區別

訓練網路做非線性變換時,經常會使用到 sigmoid tanh relu 啟用函式,來增加網路的表達能力,公式為 sigmoid y 1 1 e x frac 1 e x 1 y 取值 0,1 tanh y ex e x ex e x frac e ex e x e x e x y 取值 1,1 r...