【C語言】malloc和realloc的區別以及使用

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池中而不返回給內核。it

應當注意的是,大多數實現所分配的存儲空間比所要求的要稍大一些,額外的空間用來記錄管理信息——分配塊的長度,指向下一個分配塊的指針等等。這就意味着若是寫過一個已分配區的尾端,則會改寫後一塊的管理信息。這種類型的錯誤是災難性的,可是由於這種錯誤不會很快就暴露出來,因此也就很難發現。編譯

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

由於存儲空間分配程序的操做對某些應用程序的運行時間性能很是重要,因此某些系統提供了附加能力。例如,SVR4提供了名爲mallopt的函數,它使進程能夠設置一些變量,並用它們來控制存儲空間分配程序的操做。還可以使用另外一個名爲mallinfo的函數,以對存儲空間分配程序的操做進行統計。請查看所使用系統的malloc(3)手冊頁,弄清楚這些功能是否可用。

.alloca函數 還有一個函數也值得一提,這就是alloca。其調用序列與malloc相同,可是它是在當前函數的棧幀上分配存儲空間,而不是在堆中。其優勢是:當函數返回時,自動釋放它所使用的棧幀,因此沒必要再爲釋放空間而費心。其缺點是:某些系統在函數已被調用後不能增長棧幀長度,因而也就不能支持alloca函數。儘管如此,不少軟件包仍是使用alloca函數,也有不少系統支持它。

相關文章
相關標籤/搜索