此代码来自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;
}
答案 0 :(得分:1)
所以我不明白在这里使用alloc函数的目的。
如果要读取多行,则需要多个缓冲区来放入这些行。一旦知道大小,就分配恰好正确大小的缓冲区是有意义的,而不是分配大量的大型缓冲区。
在不使用alloc和strcpy行到p的情况下,readlines似乎可以正常工作。
那行不通。除非我们执行类似p=alloc(len)
的操作,否则p
不会指向可将行复制到的任何缓冲区。那么我们如何到达那儿呢?
可能只是likneptr [nlines ++] = line;使用alloc的目的是什么?
那没有用。这样会将likneptr[nlines++]
中的每个条目设置为相同的值,即line
的地址。每行将覆盖前一行。每行需要一个 new 缓冲区,该缓冲区不会覆盖上一行所在的缓冲区。这需要多个缓冲区。