这个项目工作,
它逐行读取一个大的日志文件,读取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
答案 0 :(得分:6)
您尚未为line
分配内存。要么声明为:
char line[256];
或为它做一个malloc
。
注意:如果您正在处理字符串(%s格式说明符),则在scanf和printf中都不需要&
答案 1 :(得分:3)
您需要在堆栈或堆上为line
分配空间。也不要将行的地址传递给fscanf
和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;
}
答案 2 :(得分:2)
您尚未为该线路分配任何空间。因此,fscanf
将您的日志文件的行写入某个随机位置的内存中,然后破坏正在发生的任何事情。你三次幸运,然后它就会爆炸。
对于此任务,理想情况下应使用getline。如果你没有,fgets会这样做,但你需要为它分配一些空间。想想char linebuf[SOME LARGE NUMBER]
。
答案 3 :(得分:2)
在行char *line
中,为一个指向char的指针分配空间。在fscanf
语句中,您将整行文本读入该地址。您永远不会为使用fscanf读取的文本分配任何空间,因此您会覆盖用于其他内容的大量内存。