为什么readlines函数使用alloc?

时间:2019-07-24 03:05:37

标签: c pointers getline readlines

此代码来自K&R C编程第109页。 getline函数已经受到MAXLEN的限制。 因此,很明显,getline返回的行的大小有限。 但是该程序在静态存储分配器“ alloc”中放入一行,并用每一行填充它,直到10000个缓冲区已满。 但是然后,main()也有MAXLINES条,读线可以返回定义为5000(在书中)。所以我不明白在这里使用alloc函数的目的。 似乎readlines可以很好地工作,而无需在p中使用alloc和strcpy行。可能只是likneptr[nlines++]=line; 使用alloc的目的是什么?

int readlines(char *lineptr[], int MAXLINE)
{
    int len, nlines;
    char line[MAXLEN];
    char *p;
    nlines = 0;

    while((len=getline(line,MAXLEN))>0)
        if ((nlines > MAXLINE)||(p=alloc(len))==NULL)
            return -1;      
        else {
            line[len - 1] = '\0';
            strcpy(p, line);
            lineptr[nlines++] = p;
        }
    return nlines;
}

#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;

char *alloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n) {
        allocp += n;
        return allocp - n;
    }
    else return 0;
}

1 个答案:

答案 0 :(得分:1)

  

所以我不明白在这里使用alloc函数的目的。

如果要读取多行,则需要多个缓冲区来放入这些行。一旦知道大小,就分配恰好正确大小的缓冲区是有意义的,而不是分配大量的大型缓冲区。

  

在不使用alloc和strcpy行到p的情况下,readlines似乎可以正常工作。

那行不通。除非我们执行类似p=alloc(len)的操作,否则p不会指向可将行复制到的任何缓冲区。那么我们如何到达那儿呢?

  

可能只是likneptr [nlines ++] = line;使用alloc的目的是什么?

那没有用。这样会将likneptr[nlines++]中的每个条目设置为相同的值,即line的地址。每行将覆盖前一行。每行需要一个 new 缓冲区,该缓冲区不会覆盖上一行所在的缓冲区。这需要多个缓冲区。