程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c說話中malloc、realloc與calloc 的差別和接洽

c說話中malloc、realloc與calloc 的差別和接洽

編輯:關於C++

c說話中malloc、realloc與calloc 的差別和接洽。本站提示廣大學習愛好者:(c說話中malloc、realloc與calloc 的差別和接洽)文章只能為提供參考,不一定能成為您想要的結果。以下是c說話中malloc、realloc與calloc 的差別和接洽正文


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函數,也有許多體系支撐它。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved