我是 C 语言新手,我正在阅读 K&R 的《C 编程语言》来学习它。我对第二版第 109 页上出现的示例函数有一个疑问:
/* readlines: read input lines */
int readlines(char *lineptr[], int maxlines)
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while ((len = getline(line, MAXLEN)) > 0)
if (nlines >= maxlines || p = alloc(len) == NULL)
return -1;
else {
line[len-1] = '\0'; /* delete newline */
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
我想知道为什么*p
这里有必要吗?p
分配了内存,然后line
被复制到其中。为什么不能只是line
被使用,所以最后lineptr[nlines++] = p
可以替换为lineptr[nlines++] = line
.
如果你不为每一行分配内存,你最终会得到lineptr
是一个充满指向您读取的最后一行的指针的数组(更不用说可能被覆盖的堆栈内存)。在读取时为每一行分配内存使得返回的数组有意义。举个例子,我们说line
碰巧在堆栈地址 0x1000 处分配。如果您进行建议的更改,结果将是lineptr
8 行文件的数组为:
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000
哟哟!在读取每一行时为其分配内存,然后将该行复制到分配的内存中是唯一的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)