儲存空間動態分配

2021-05-27 03:01:15 字數 1586 閱讀 4966

**:

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函式,也有很多系統支援它。

c 中使用new動態分配儲存空間

下面這個例子,檢驗new給double型陣列分配的儲存空間的首位址是多少。s是指向這個陣列的指標,s 1即是指標移動一位,指向下乙個元素。root sparkmaster test cat newarray.cpp include int main double s int i s new doub...

mallco動態分配 malloc動態分配多維陣列

下面試自己寫的三個測試程式,如果看懂了基本上動態分配多維陣列就沒什麼問題啦 重點 1 深刻理解多維陣列的概念,多維陣列在記憶體中的分配情況,基本上動態分配也沒什麼問題的。然後還要注意一點的就是,釋放是分配的逆過程!include include include void main void int ...

9專案三動態分配空間儲存

問題及 檔名稱 main.cpp 作 者 李磊濤 版 本 號 v1.0 問題描述 深複製輸出公資清單。輸入描述 10名員工的工資。程式輸出 清單。includeusing namespace std class salary 下面定義類的成員函式 salary salary int n salary...