【发布时间】:2014-08-17 20:52:25
【问题描述】:
如果这个问题看起来“简单”,但我无法在任何地方找到答案,我真的很抱歉。 我尝试使用 fgets() 从文件中读取一行。 为了确保不浪费空间,首先我找到了行的长度:
do
{
c= getc(file);
words++;
}while (c!=EOF && c!='\n');
然后我为确切的字数分配内存:
char* line = (char*)malloc(sizeof(char)*(words));
然后,我使用 fgets() 将行读取到行缓冲区。 但问题是,这是有效的。 但我一直认为你也应该为空终止字符分配内存。 那么这里发生了什么?
【问题讨论】:
-
附带说明:转换
malloc()的返回值是有害的,sizeof(char)始终为 1。所以最后一行正确的是:char *line = malloc(words + 1); -
附加说明,
words作为变量计数字节的名称有点让人分心。 -
以及您的原因:许多系统分配的数量超过了您的要求。系统只是保证它不会分配小于所需大小,而不是它不会分配更多(严格来说,对于过度使用的系统,实际上没有任何保证)。
-
是的,没错,我这样做是出于某种原因并没有更改它(我说的是变量名)
-
请注意,对
getc()的调用读取一行;随后对fgets()的调用读取下一行——除非有你没有向我们展示的记录和重置输入流上的读取位置的代码(并且并非所有文件类型都是可搜索的——命名的管道和终端,但两个不是)。我建议使用 POSIXgetline(),因为它可以根据需要自动分配空间。