成功执行3行后的分段错误

时间:2013-04-11 19:04:17

标签: c gcc libc

这个项目工作,
它逐行读取一个大的日志文件,读取3行后,显示分段错误。

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 个答案:

答案 0 :(得分:6)

您尚未为line分配内存。要么声明为:

char line[256];

或为它做一个malloc

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

答案 1 :(得分:3)

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

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;
}

答案 2 :(得分:2)

您尚未为该线路分配任何空间。因此,fscanf将您的日志文件的行写入某个随机位置的内存中,然后破坏正在发生的任何事情。你三次幸运,然后它就会爆炸。

对于此任务,理想情况下应使用getline。如果你没有,fgets会这样做,但你需要为它分配一些空间。想想char linebuf[SOME LARGE NUMBER]

Never use *scanf.

答案 3 :(得分:2)

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