引用:
テスト if (allocbuf + ALLOCSIZE - allocp >= n) { は、n 文字の要求を満たすのに十分なスペースがあるかどうかを確認します。存在する場合、allocp の新しい値は、allocbuf の終わりを超えて最大 1 になります。
関連するコード:
#define ALLOCSIZE 10000 /* size of available space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf; /* next free position */
char *alloc(int n)
/* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp - n; /* old p */
} else
/* not enough room */
return 0;
}
void afree(char *p) /* free storage pointed to by p */
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
では、どうすれば allocbuf の最後の位置を超えることができるのでしょうか? 私の意見では allocbuf[9999]
それを超えるもの。allocbuf[10000] は正しくなく、メモリ リークですよね?
質問の 2 番目の部分 - その名前によると、afree 関数は配列内の特定の場所に保存された値を削除していると思います。しかし、私が見ることができるように、「記録ヘッド」を配列の左側に数か所移動するだけですか?そこに保存されたデータはそのまま残ります。