0

なぜこの単純な関数がセグ フォールトを引き起こすのでしょうか?

int main(int argc, char** argv) {
    FILE* file1;
    file1 = fopen(argv[argc + 1], "wt");
    fclose(file1);
}
4

2 に答える 2

3

あなた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そして、あなたが期待する値に設定されていることを確認した後、あなたが開いている名前を印刷してください - それはあなたの問題について多くのことを教えてくれます.

于 2012-02-28T19:26:23.027 に答える
2

の最後の要素の後に 2 つの要素にアクセスしますargv。の戻り値もチェックしませんfopen()。どちらもセグメンテーション違反を引き起こす可能性があります。

于 2012-02-28T19:22:58.487 に答える