1

このプログラムは動作し
ます. 大きなログファイルを 1 行ずつ読み込みます. 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

4 に答える 4

6

にメモリが割り当てられていませんline。次のように宣言します。

char line[256];

またはそれmallocを実行します。

&注:文字列 (%s 書式指定子) を扱う場合は、scanf にも printf にも必要ありません。

于 2013-04-11T19:07:24.693 に答える
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;
}
于 2013-04-11T19:07:52.623 に答える
2

行にスペースをまったく割り当てていません。 fscanfしたがって、ログファイルの行をメモリのランダムな場所に書き込んで、そこにあるものを壊しています。3回運が良ければ、爆発します。

このタスクでは、理想的にはgetlineを使用する必要があります。それがない場合はfgetsで十分ですが、ある程度のスペースを割り当てる必要があります。考えてみてくださいchar linebuf[SOME LARGE NUMBER]

絶対に使用しないでください*scanf

于 2013-04-11T19:08:23.640 に答える
2

char *lineでは、char への 1 つのポインターにスペースを割り当てます。あなたのfscanf声明では、テキストの行全体をそのアドレスに読み込んでいます。fscanf で読み取るテキストにスペースを割り当てることはないため、他の目的で使用される大量のメモリを上書きします。

于 2013-04-11T19:09:19.617 に答える