2017-01-05 4 views
-2

プログラミングが数ヶ月前に開始されたので、私の質問によって気分が悪くなる可能性があります(申し訳ありません)。ファンクションへのファイルポインタの受け渡し

私はこのような機能から、私のあるtest.txtファイルに何かを印刷したいとしましょう:

メイン:

int main() 
{ 
    FILE *fp; 
    test(fp); 
    ... 
} 

が機能:

void test(FILE *fp) 
{ 
    fp = fopen("test.txt","w"); // it crashed here 
    ... 
} 

VSでのデバッグは言います: "変数 'fp'は初期化されずに使用されています。

は、その後、私は私の主な機能の最初の行を変更することを決めた:

FILE *fp = NULL; 

そして突然、すべてが正常に動作します。

誰かがこの現象を説明できますか?

+2

あなたが式を評価するとき、あなたは何をやっているされて初期化されていない値を(読むために未定義の動作であるので、それは問題ではありません。 'test(fp)')。 –

+0

コードは実際には意味をなさないが、未定義の動作は問題ではなく*症状*であることをもう一度示している。 –

+0

問題は、テストが戻ったときに変数fpがfopen呼び出しによって割り当てられた値を保持しないということです。したがって、後でメインで使用すると問題が発生します – bruceg

答えて

3

あなたの質問は、実際のファイルポインタとは何の関係もありません - このプログラムはあなたにintを使用して、同じ警告を与える:

void test(int i) 
{ 
    i = 5; 
    ... 
} 

int main() 
{ 
    int i; 
    test(i); 
    ... 
} 

あなたは関数に初期化されていない変数を渡されたので、警告があります。初期化されていない変数は任意の値を保持できます(またはアクセスしたときにがプログラムをクラッシュさせる可能性がありますが、実際は発生しません)。

だから、警告はあなたに「おい、あなたは値が何であるか分からないところで値を渡しているのですか?

しかし、あなたのtest機能は、その後に渡された値を無視して進む。

関連する問題