通过K& R我也看看下面的代码:
#define ALLOCSIZE 1000
static char allocbuf[MAXLINE];
static char *allocp = allocbuf
char *alloc(int n){
if (allocbuf+ALLOCSIZE-allocp>=n){
allocp+=n;
return allocp-n;
}
else { ... }
我担心我的问题非常简单,但我无法理解“if”行。 allocbuf有什么价值?它是一个char数组,对吧?我回头看了书中的数组内容,但没有用。 allocp最初指向数组的第0个元素,对吧?
答案 0 :(得分:2)
allocbuf
是一个类型为char []
的数组,但在许多上下文中,标识符本身会衰减为类型为char *
的指针,并保存数组的起始地址。请注意,这并不意味着allocbuf
是一个指针,它仍然是一个数组。
因此,if
语句的条件执行一些指针算法。
答案 1 :(得分:1)
虽然它们以不同的方式声明,但allocp和allocbuf都是char数组(char *),并且allocp在初始化之后有效地指向缓冲区的第一个char,并且在通过“if”主体之后指向相同的地址+分配的字节数,此数字随着“if”正文中的每个新周期而增加。总而言之,它指向缓冲区中的第一个空闲字符。 您坚持使用的“if”行旨在验证是否有足够的空间在allocbuf(静态缓冲区)中分配n个字符。 这条线可以分解如下:
char* static_buffer_beginning = allocbuf;
char* static_buffer_ending = static_buffer_beginning + MAXLINE;
int nb_chars_still_available = static_buffer_ending - allocp;
if (nb_chars_still_available >= n) {
我对你的代码中出现的“ALLOCSIZE”感到有些困惑:他的价值是什么,它来自哪里?!我认为这是一个错字或类似的东西,它的价值等于MAXLINE,但我想确保不给你一个错误的答案。
答案 2 :(得分:0)
将allocbuf视为指向RAM开头的指针,比如0.然后allocbuf + ALLOCSIZE将指向RAM的末尾。 allocp指向已分配区域的末尾,位于RAM中间的某个位置。所以allocbuf + ALLOCSIZE-allocp将为您提供可用的内存大小。 if语句检查您请求的分配大小(n)是否小于可用的可用内存。
答案 3 :(得分:0)
allocbuf是一个静态数组,实际上它指向连续的字符集(数组)的第一个元素。 allocp是另一个指向连续数组的指针,您可以将其值更改为指向数组元素。