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