なぜこの単純な関数がセグ フォールトを引き起こすのでしょうか?
int main(int argc, char** argv) {
FILE* file1;
file1 = fopen(argv[argc + 1], "wt");
fclose(file1);
}
あなたfopen()
はファイルを開くのに失敗しているので、fp
NULL であるため、fclose()
正当にクラッシュして異議を唱えています。からのリターンを確認してくださいfopen()
。
また、定義により、argv[argc] == 0
andargv[argc+1]
は配列の末尾を超えています。実際には、Unix システムでname=value
は、最初の環境変数の であることがよくありますが、有効なファイル名である可能性は低く、正当に取得されたものではないことはほぼ確実です。
プログラムが次のように呼び出される場合:
./a.out file.txt
ファイル名は次のとおりですargv[1]
。が指す文字列argv[0]
はプログラムの名前であり、パスa.out
情報を提供または取得します。ファイルを開く前に、必ず確認してください。argc == 2
argv[2] == 0
argc == 2
特に などの「失敗することがわかっている」関数からの戻りステータスを常に確認してくださいfopen()
。argc
そして、あなたが期待する値に設定されていることを確認した後、あなたが開いている名前を印刷してください - それはあなたの問題について多くのことを教えてくれます.
の最後の要素の後に 2 つの要素にアクセスしますargv
。の戻り値もチェックしませんfopen()
。どちらもセグメンテーション違反を引き起こす可能性があります。