不确定K&R中句子的正确性 - 指针算术| 解放程序

Pet*_*rba 5 c pointers kernighan-and-ritchie

报价:

测试if(allocbuf + ALLOCSIZE - allocp> = n){检查是否有足够的空间来满足n个字符的请求.如果存在,allocp的新值最多只能超出allocbuf的末尾.

与之相关的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

那怎么能超越allocbuf的最后一个位置呢?我认为是allocbuf [9999]

除此之外的任何事情.allocbuf [10000]不正确并且是内存泄漏,对不对?


问题的第二部分 - 我认为根据其名称的afree函数是删除保存在数组中特定位置的值.但是我可以看到它只是将"记录头"移动到阵列左侧的几个位置?保存在那里的数据保持不变.

pal*_*ind 5

allocp应始终指向最后一个空闲记忆位置,但是当没有记忆位置空闲时,它将超出结束位置allocbuf.

考虑缓冲区中只剩下一个存储单元的情况:allocp将指向,allocbuffer[9999]因为那是最后一个空闲存储单元.现在当你使函数调用alloc(1)测试时

allocbuf + ALLOCSIZE - allocp >= n
Run Code Online (Sandbox Code Playgroud)

将返回true,因为你试图分配一个char并且char只剩下一个.然后将分配最后一个记忆位置.现在allocbuf - allocp == ALLOCSIZE,是一个超越结束allocbuf.但在这种情况下,上面提到的测试将始终返回false,因此不会超出范围访问任何内存allocbuf.


关于您的问题afree:返回的内存的初始值malloc是未定义的.这意味着您永远不能对其做出任何假设,并且必须在使用前覆盖它.因此,afree不必删除任何与您假设的数据相反的数据.简单地将其标记为不再使用并可用于将来分配是完全正确的.

在旁注中,有一个与malloc命名非常相似的函数calloc,在分配请求的内存块之后将其全部初始化为零.