【问题标题】:Segmentation fault after successfully executing 3 lines成功执行 3 行后出现分段错误
【发布时间】:2013-04-11 19:04:17
【问题描述】:

这个程序工作,
它逐行读取一个大日志文件,读取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

【问题讨论】:

  • 你试过调试器吗?
  • @FredrikPihl 不,让我知道,使用哪个以及如何使用?
  • 如果你在linux系统上,我推荐gdb
  • @Kajal - gdb
  • @Kajal 在进行调试之前我认为你应该阅读buffer overflow 你的代码很容易找到..未定义的行为。

标签: c gcc libc


【解决方案1】:

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

char line[256];

或者为它做一个malloc

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

【讨论】:

  • 1+。此外,line 已经是一个指针。执行&line 将获得“指向指针的指针”,在这两种情况下都使用它有什么问题。
  • @KingsIndian 我怎么能用 char *line 做到这一点; , 不被数组改变
  • 另外不要忘记检查 fopen 的返回值,在这种情况下为 my_stream 的值,以确保您可以实际读取文件。
  • @Kajal 然后你必须使用malloc(或calloc)分配内存。做:line = malloc(256); 在使用 line 之前。即在while循环之前。注意256 只是我使用的数字,您可以根据需要更改。
  • @KingsIndian char *line;文件 *my_stream; char *my_filename = "pwd.lst"; my_stream = fopen (my_filename, "r");行 = malloc(256); while(fscanf (my_stream, "%s", &line)!= EOF) { printf ("==> %s\n", &line); } fclose (my_stream);改变了,但仍然是同样的错误
【解决方案2】:

您需要在堆栈或堆上为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;
}

【讨论】:

    【解决方案3】:

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

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

    Never use *scanf.

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你能详细解释一下,那我该如何解决
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多