1

这个程序工作,
它逐行读取一个大日志文件,读取3行后,它显示segmentation fault。

int main(int argc, char *argv[])
{
  char *line;
  FILE *my_stream;
  char *my_filename = "log";
  my_stream = fopen (my_filename, "r");
  while(fscanf (my_stream, "%s", &line)!= EOF)
  {
  printf ("==> %s\n", &line);
  }
  fclose (my_stream);   
  return 0;
 } 

输出

==> 123    ==> 12345    ==> 1234568 Segmentation fault
4

4 回答 4

6

您还没有为line. 要么将其声明为:

char line[256];

或者malloc为它做一个。

&注意:如果您正在处理字符串(%s 格式说明符),则不需要在 scanf 和 printf 中

于 2013-04-11T19:07:24.693 回答
3

您需要line在堆栈或堆上分配空间。也不要将 line 的地址传递给fscanfand printf

int main(int argc, char *argv[])
{
    char line[256];
    FILE *my_stream;
    char *my_filename = "log";
    my_stream = fopen (my_filename, "r");
    while(fscanf (my_stream, "%255s", line)!= EOF)
    {
        printf ("==> %s\n", line);
    }
    fclose (my_stream);

    return 0;
}
于 2013-04-11T19:07:52.623 回答
2

您根本没有为该行分配任何空间。 fscanf因此,将您的日志文件的行写入某个随机位置的内存中,并破坏那里发生的任何事情。你幸运了三遍,然后它就爆炸了。

对于此任务,您最好使用getline。如果你没有,fgets会做,但你需要为其分配一些空间。想想char linebuf[SOME LARGE NUMBER]

永远不要使用*scanf.

于 2013-04-11T19:08:23.640 回答
2

在这一行中char *line,您为一个指向 char 的指针分配空间。在您的fscanf陈述中,您将整行文本读入该地址。您永远不会为使用 fscanf 读取的文本分配任何空间,因此您会覆盖大量用于其他事情的内存。

于 2013-04-11T19:09:19.617 回答