0

入力ファイルからデータを読み取る関数を何度か呼び出します。デバッグモードではすべて正常に動作しますが、実行可能ファイルをリリースモードから実行しようとすると、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のクラッシュにどのように適合するかはわかりません。誰かが何が起こっているのか知っていますか?ありがとう!

編集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()呼び出し以外の場所では使用されません。

4

1 に答える 1

0

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

編集:

これのもう1つの一般的な原因は、ファイル名文字列が突然NULLで終了しなくなることです。

printf()開く前にファイル名を印刷する呼び出しを追加する必要があります。ほとんどの場合、期待される出力を生成できません。そうでない場合は、より興味深い形のメモリ破損が発生し、それを取り除くためにさらに作業が必要になります。

編集2:

呼び出しが正しい文字列を示している場合はprintf()、コードのどこかでメモリが破損しており、Cライブラリの内部構造が壊れている可能性があります。一般的な原因は、静的配列またはによって提供される領域の終わり(またはそのことについては始まり)を超えていることmalloc()です。

于 2011-01-12T18:38:32.243 に答える