複製鏈接
請複製以下鏈接發送給好友

alloc

鎖定
函數alloc是可返回一個指向n個連續字符存儲單元的指針,alloc函數的調用者可以利用該指針存儲字符序列。
外文名
alloc
實    質
函數
含    義
指向n個連續字符存儲單元的指針
作    用
存儲字符序列

目錄

alloc函數的使用

函數afree(p)釋放已經分配的存儲空間,以便以後使用。之所以説這兩個函數是“不完善”的,是因為對afree函數的調用次序必須與調用alloc函數的次序相反。換句話説,alloc與afree以棧的方式(即後進先出的列表)進行存儲空間的管理。
最容易的實現方法是讓alloc函數對一個大字符數組allocbuf中的空間進行分配。該數組是alloc和afree兩個函數私有的數組。由於函數alloc和afree處理的對象是指針而不是數組下標,因此,其他函數無需知道該數組的名字,這樣,可以在包含alloc和afree的源文件中將該數組聲明為static類型,使得它對外不可見。
實際實現時,該數組甚至可以沒有名字,它可以通過調用malloc函數或者向操作系統申請一個指向無名存儲塊的指針獲得。
allocbuf中的空間使用情況:我們使用指針allocp指向allocbuf中的下一個空閒單元。當調用alloc申請n個字符的空間時,alloc檢查allocbuf數組中有沒有足夠的剩餘空間。如果有足夠的空閒空間,則alloc返回allocp的當前值(即空閒塊的開始位置),然後將allocp加上n 以使它指向下一個空閒區域。如果空閒空間不夠,則alloc返回0。 如果p在allocbuf的邊界之內,則afree(p)僅僅只是將allocp的值設置為p

alloc實例

#define ALLOCSIZE 1000 /* 可用空間大小 */
static char allocbuf[ALLOCSIZE] /* alloc使用的存儲區 */
static char * allocp=allocbuf; /* 下一個空閒位置 */
char *alloc(int n) /* 返回指向n個字符的指針 */
{
if(allocbuf+ALLOCSIZE-allocp>=n) /* 有足夠的空閒空間 */
{
allocp+=n;
return allocp-n; /* 分配前的指針p */
}
else /* 空閒空間不夠 */
{
return 0;
}
}
void afree(char * p) /* 釋放p指向的存儲區 */
{
if(p>=allocbuf && p< allocbuf + ALLOCSIZE)
allocp=p;
}
[1] 
參考資料
  • 1.    C程序設計語言(第二版) Brian W.Kernighan著