2017-05-26 10 views
0

ファイルからデータを読み込もうとしていますが、STATUS_STACK_BUFFER_OVERRUNエラーが発生し、アプリケーションがクラッシュします。ファイルの読み取り中に文字バッファがオーバーランしています

私は、構造体があります。

struct BSPEntities 
{ 
    char* ents; 
}; 

そして、私は、ファイル読んでいる:

BSPEntities entities 
ifstream mapfile; 
int size = 54506; 
int offset = 5182600; 

entities.ents = new char[size]; 
mapfile.seekg(offset, ios::beg); 
mapfile.read((char *)(&entities.ents), size); 

「サイズ」との値をファイルからロードされ、有効であることが知られている「オフセット」を。 BSPEntities構造体の周りにプリプロセッサディレクティブ#pragma pack(1)と#pragma pushがあります。

ありがとうございました。

+0

なぜ新しいrawを使用していますか? –

答えて

2

&entities.entsは、charへのポインタへのポインタです。指されているオブジェクト(charへのポインタ)は、あなたがターゲットとしているアーキテクチャによってはおそらく4または8バイトですが、54,506バイトを書き込むようにしようとしています。明らかに54,506は8よりも大きいので、ポインタの最後を越えて書いているので、動作は未定義です。読み

はちょうどあなたが表示されていないしているということが起こって、より複雑なものがありますしない限り、また、あなたは、ここに#pragma packで周り台無しにする必要はありませんmapfile.read(entities.ents, size);

でなければなりません。

+0

申し訳ありませんが問題でした。私は今、馬鹿だと感じる。私はパックとプッシュを使用しているので、VSは構造体を埋め込み、私がファイルを読むと間違った結果を出すためです。 – Hermetix

+0

@Hermetixあなたは構造体自体に直接データを読み込んでいないので、構造体の埋め込みは無関係です。 –

1
mapfile.read((char *)(&entities.ents), size); 

は代わりに、あなたがents自身のアドレスを渡しているentsポイントがすることをヒープメモリブロックのアドレスを渡すの

mapfile.read(entities.ents, size); 

であるべき。 entsがスタックに割り当てられているので、オーバーランするまでスタック上のバ​​イトを読み込んでいます。

+1

'(char *)'キャストは必要ありません。 –

関連する問題