書かれたコードは、セグメンテーション違反を引き起こしません(少なくとも私にとっては)。あなたが見せていないものがもっとない限り、それがどのようにあなたのためにそれをしているのかわかりません.
のドキュメント、freopen()特に戻り値に関する部分を確認してください。
ファイルが正常に再オープンされた場合、関数はパラメーター stream として渡されたポインターを返します。これは、再オープンされたストリームを識別するために使用できます。それ以外の場合は、ヌル ポインターが返されます。ほとんどのライブラリ実装では、errno 変数も、失敗時にシステム固有のエラー コードに設定されます。
そのため、新しくリダイレクトされたストリームを使用する前に、戻り値と errno 値を確認してください。エラーの原因である可能性があります。
行の前にコードが segfaulted の場合printf("roar");、それが表示されない理由です。その後セグメンテーション違反が発生した場合は、「roar」がファイルにあるはずですp2.out。
重要な注意事項:プログラムの最後にfclose stdinとを忘れないでください。stdoutこれらはそれぞれ と にリダイレクトされるp2.inようp2.outになったので、使い終わったら閉じる必要があります。