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] /* 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;
}