如果这个问题看起来很简单,我真的很抱歉"但我无法在任何地方找到答案。 我试图使用fgets()从文件中读取一行。 为了确保没有浪费空间,首先我找到了线的长度:
do
{
c= getc(file);
words++;
}while (c!=EOF && c!='\n');
然后我分配了内存以确保单词的数量:
char* line = (char*)malloc(sizeof(char)*(words));
然后,我使用fgets()读取行缓冲区的行。 但问题是,这是有效的。 但我一直认为你也应该为null终止char分配内存。 那么这里发生了什么?
答案 0 :(得分:4)
你确实需要为null终结符分配空间。这是有效的事实并不意味着它总是会(至少在C中)。
另外,fgets
也会返回\n
个字符。所以你需要两个额外的字符。一个用于\n
,一个用于\0
。
我会推荐这种方法:
char buffer [1024];
if ( fgets (buffer, 1024, f) != NULL ) {
// so something with buffer
}
答案 1 :(得分:1)
纯粹的运气。写入已分配内存的末尾是未定义的行为。它不会立即崩溃。它可能会立即崩溃,或者稍后会崩溃,或者它可能会正常工作。这一切都取决于覆盖的大小以及紧随其后的内存。它经常是填充或当前未使用的空间,因此只是工作。但你不能指望这一点。正确的答案是malloc比需要多2个字符(终结符为1,fgets将复制1个)。