alloc
可返回一個指向n個連續字元存儲單元的指針
函數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
#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE]
static char * allocp=allocbuf;
char *alloc(int n)
{
if(allocbuf+ALLOCSIZE-allocp>=n)
{
allocp+=n;
return allocp-n;
}
else
{
return 0;
}
}
void afree(char * p)
{
if(p>=allocbuf && p< allocbuf + ALLOCSIZE)
allocp=p;
}