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