0

私は C のオンライン コースに従っています (リンク)。

void Database_create(struct Connection *conn, int max_rows, int max_data)
{
  printf("Database_create with max_rows = %d, max_data = %d\n",max_rows,max_data);
  int i = 0;

  printf("Starting for-loop\n");
  for(i = 0; i < max_rows; i++) {

    printf("i");
    struct Address addr = {.id = i, .set = 0};

    printf("a");
    conn->db->rows[i] = addr;
  }
  printf("Done!");
}

これを実行すると、上記の関数が呼び出され、出力は次のようになります。

toon@ToonAlfrinkPC ~/Projects/lcthw $ ./ex17 test.db c 200 513
Database_create with max_rows = 200, max_data = 513
Segmentation fault

今、私は for ループのどこかで間違いを犯したと確信していますが、それは無関係です。「Starting for-loop」が出力されないことが心配です。これは、エラーがこれら 2 つの print ステートメントの間のどこかにあることを意味しているに違いありません。

i の初期化または printf の呼び出しによってセグメンテーション エラーが発生しましたか? そうでない場合、空白はありましたか?どうすればそれが可能でしょうか?

注:コンパイルするのを忘れていませんでした。

編集:

さらに混乱を招くのは、Database_create 関数が調整なしで正常に機能するようになったことです。

異なる機能を同時に実行することは可能ですか? プログラムは次のようになります。

if(argc != 5) die(conn, "USAGE: ex17 <dbfile> create <max_rows> <max_data>");
Database_create(conn,atoi(argv[3]),atoi(argv[4]));
Database_write(conn);
break;

Database_write 関数がエラーを引き起こしているようですが、Database_create が完了する前にそのエラーがスローされる可能性はありますか?

編集:

「調整なし」と言いましたが、最後のコメントの後に改行を入れました(「完了!\ n」)。

4

1 に答える 1

0

stdout は通常、ライン バッファリングされます。したがって、印刷する文字列が改行で終了しない限り、後でバッファリングされて表示されます。おそらく、プログラムが終了するまで遅くなります。

これが意味することは、出力が表示されなくても、printf の後に問題が発生する可能性があるということです。

これを避けるには、終了改行を持たないすべての printf ステートメントの後に fflush(stdout) を置きます。

于 2012-11-18T01:47:30.027 に答える