这是C中的代码:

#define ALLOCSIZE 1000 /* 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 */
        ...
    }
}

我不明白以下表达式中发生了什么:
allocbuf + ALLOCSIZE - allocp >= n

我知道allocbuf作为数组名等效于指向第一个元素&allocbuf [0]的指针,显然allocp是指针,最后ALLOCSIZE是一个简单的int。因此,将ALLOCSIZE添加到allocbuff会得到allocbuff的ALLOCSIZE索引元素,这也是一个指针。但是从指针&allocbuf [ALLOCSIZE]中减去指针allocp是我迷失的地方。我什至不知道可以在C中添加指针。

请告诉我我错了什么,或者我在这种解释中缺少什么。

该程序的重​​点是存储字符。

最佳答案

该代码是固定缓冲区分配器,正在检查以确保您至少剩余n个字节。它有助于以图形方式查看事物,而通过图形方式我指的是MSPaint:

因此,分解表达式:

allocbuf + ALLOCSIZE - allocp >= n
allocbuf + ALLOCSIZE是数组的末尾。 end和allocp之间的区别是剩余字节。因此,我们只是检查以确保差异至少为n

减去两个指针,只要它们指向同一数组(或一端到最后)中的元素,就可以很好地定义为它们之间的元素数。作为一个简单的示例,allocbufallocbuf + ALLOCSIZE都是指针(类型为char*)和(allocbuf + ALLOCSIZE) - allocbuf == ALLOCSIZE,它们之间是元素的数量(在这种情况下,类型为char)。

10-04 16:24