2011-01-12 7 views
0

入力ファイルからデータを読み込む関数をいくつか呼び出します。デバッグモードではすべてうまく動作しますが、リリースモードから実行可能ファイルを実行しようとすると、いくつかの呼び出しの後でfopenを含む行がプログラムをクラッシュさせます。私のコードは次のとおりです。 ヘッダファイルから:機能でリリース実行可能ファイルから実行しているときにのみfopenがクラッシュする

#define presstankdatabase "presst_database.txt" 

:デバッグで

FILE *fidread; 

fidread = fopen(presstankdatabase,"r"); 
if (fidread==NULL) { 
    printf("Failed to open pressurant tank database: %s\n",presstankdatabase); 
    return 1; 
} 

、私はちょうど前に、ちょうどラインがfidread =で開始した後、いくつかの後のコメント行を挿入しましたプログラムがクラッシュすると、「問題が原因でプログラムが正常に動作しなくなりました。プログラムを終了してください」というメッセージが表示されます。 fopen呼び出しの直前のコメントが表示されますが、直後のコメントは表示されません。私がfopenを理解していることは、ポインタかNULLのどちらかを返すべきですが、チェックに至る前にクラッシュすることです。私が考えることができるのは、どういうわけか私は記憶上の問題を抱えていますが、私はそれがどのようにfopenのクラッシュに適合するのか分かりません。誰が何が起こっているかも知っていますか?ありがとう!

EDIT 1:私は3つの変数のサイズを増やしました。使用されている場所はprintf()呼び出しを除いて、以下のようになりました。

char *constid = (char*)malloc(sizeof(char)*20); 

はそうように使用:

strcpy(constid,"Propellant"); 
strcpy(constid,"Propellant tank"); 
strcpy(constid,"Pressurant tank"); 

変数は20サイズである場合、上記のように、それがクラッシュ。しかし、もし彼らがより大きい(私は120と100を試してみました)、プログラムが実行されます。変数は、fprintf()やprintf()以外の場所では使用されません。

+0

あなたのコードにはおそらく他の問題があります。あなたが見ている問題は、これの副作用です。 valgrindの下で実行してみてください。 –

+0

@Paul R:残念ながら、Windowsではvalgrindというものはありません。 VCはソースベースのメモリデバッグ機能を持っていますが... – thkala

答えて

0

presstankdatabaseは、開くファイル名を含む文字列へのポインタにする必要があります。 fopen()がクラッシュした場合、そのポインタはおそらく無効です(またはNULL)。それ以上のコードがなければ、それをさらにデバッグすることはできません。 ...何が起こっているかを確認するためにVCのデバッガを使用し

EDIT:

本の別の一般的な原因は、突然、NULL終端されて停止し、ファイル名の文字列です。

ファイルを開く前に、printf()コールを追加してファイル名を出力する必要があります。おそらく期待される出力が得られないでしょう。もしそうでなければ、メモリ破損のより面白い形があり、これは雑草を取り除くためにもっと多くの作業を必要とします。

EDIT 2:printf()呼び出しが正しい文字列を示し

場合、あなたはおそらくCライブラリの一部の内部構造を台無しにしているあなたのコード内のどこかにメモリ破損があります。共通の原因は、静的配列またはmalloc()によって提供される領域の終わり(またはその問題の始まり)を超えています。

+0

printf()を呼び出すと正しい文字列が生成されます(%sxxxを使用し、xxxを使用して空白がないことを確認しました)。どのような種類のメモリ破損が起こる可能性がありますか?私はデバッガを調査していますが、今使用する方法はわかりません。私はいつもコメントを挿入してプログラムをデバッグしました。 – Jade

+0

FILE * fidwriteを使用してこの関数を呼び出すと、ループ内にあります。このループの前に、ループが実行されているときに書き込む別のファイルを開きます(FILE * fidwritediag)。 2つのファイルを同時に開くことができますか?1つはループ内にあります(実際には3つのループのネストです)。何か関係はありますか? – Jade

+0

@翡翠:私の編集を参照してください。すべてのmalloc呼び出しに大きなメモリを追加してみてください。これで問題が解決されたら、問題の追跡を開始します。 – thkala