0

Visual stduio 2008 c++ を使用しています。そして、私はWindowsフォームアプリケーションを書いています。Form1.h の先頭にある FILE* 配列をグローバル値として宣言します。

const int k = 1; //i need to change k to 2 sometimes. 
FILE* myFiles[k]; 

From1 のコンストラクターでは、for ループを使用してファイルを fopen します。

for(int i = 0; i < k; ++i)
{    
  char filename[100] = "";
  sprintf(filename,"Record/record_%ld_%d.txt",g_recordName,i);
  myFiles[i] = fopen(filename,"w");
}

そして、このフォームにタイマーを設定します。タイマーを刻むたびに、何かが myFiles に出力されます。ここまでは問題ありませんが、次のようなものを入れると

fprintf(myFiles[0],"%d",1234); 

forループの後にコンストラクターに。この行は問題なく動作しますが、タイマーの tick イベントで何かを fprintf しようとすると、myFiles[0] が既に NULL に設定されていることがわかりました!!

さらに、コンストラクターで I の場合fprintf(myFiles[0],"something")、FILE ポインターはタイマーの tick イベントで null になりません。

なぜこれが起こるのですか?誰かが理由を知っていますか?

4

2 に答える 2

2

バッファ オーバーランの非常に単純なケースです。表現sprintf(filename,"Record/record_%ld_%d.txt",g_recordName,i);は犯人である可能性が最も高いです。

于 2011-07-22T12:18:25.840 に答える
0

Ajay の助けに本当に感謝します! はい、この問題 (バッファ オーバーラン) は sprintf、fprintf によって引き起こされます。彼らはかなり脆弱なようです。そこで、C++ のようなもの (iostream と fstream) を使用してコードを変更しました。今、それは私に働きます。:) ありがとうございました。

于 2011-07-23T09:48:15.097 に答える