内存为具有null终止char的fgets分配字符串

时间:2014-08-17 20:52:25

标签: c string null fgets

如果这个问题看起来很简单,我真的很抱歉"但我无法在任何地方找到答案。 我试图使用fgets()从文件中读取一行。 为了确保没有浪费空间,首先我找到了线的长度:

do
    {
        c= getc(file);
        words++;
    }while (c!=EOF && c!='\n');

然后我分配了内存以确保单词的数量:

char* line = (char*)malloc(sizeof(char)*(words));

然后,我使用fgets()读取行缓冲区的行。 但问题是,这是有效的。 但我一直认为你也应该为null终止char分配内存。 那么这里发生了什么?

2 个答案:

答案 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个)。