了解内存分配的 C 代码示例

2024-01-14

我是 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 处分配。如果您进行建议的更改,结果将是lineptr8 行文件的数组为:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解内存分配的 C 代码示例 的相关文章

随机推荐