gpt4 book ai didi

c - 了解具有内存分配的 C 代码示例

转载 作者:行者123 更新时间:2023-12-01 11:54:46 24 4
gpt4 key购买 nike

我是 C 的新手,我正在阅读 K&R 的“The C Programming Language”来学习它。我对第 2 版第 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 的堆栈上分配。如果您进行建议的更改,则生成的 8 行文件的 lineptr 数组将是:

0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000

哟哟哟!唯一的解决方案是在读取每一行时为其分配内存,然后将该行复制到分配的内存中。

关于c - 了解具有内存分配的 C 代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8289410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com