1

他の質問では、107776エントリの辞書を持つベクトルが必要で、コンパイルできなかったため、大量のデータを含むベクトルをコンパイルする方法を尋ねました。

私はこの答えのコードのおかげでそれを解決しました:

char const * const dict[] = {"aaron",...};

しかし、今問題は、1つのエントリにアクセスしようとすると...

cout<<dict[431104]<<endl;

...プログラムがフリーズし、Windowsがプログラムを閉じようとしています。

なぜそれが起こるのですか?どうすれば解決できますか?

編集:申し訳ありませんが、それは私のせいでした。tbrobergとSethCarnegieがこの回答sizeof(dict)で気づいたように、間違いは、それが(ではなく)配列の長さであると思ったということでしたsizeof(dict)/sizeof(*dict)。したがって、431104は配列の境界をはるかに超えていました(長さは107776です)。

4

2 に答える 2

3

スタックに107776を割り当てchar*ています。これは、コンピュータでスタックオーバーフローを引き起こすのに十分な場合があります。ヒープにsを割り当ててchar*、初期化子リストを使用してみてください。

const char** dict = new const char*[107776] {"aaron",...};

// ... use dict

delete[] dict;

これで問題は解決するはずです(問題がスタックサイズである場合、それはそうだと思います)。

また、インデックス431104が、サイズが107776の配列の境界をはるかに超えていることに気づきました(以前は100万と誤解していました)。問題が範囲外のインデックスだけではないことを確認しますか?

于 2012-07-19T19:09:30.977 に答える
0

static前に置いてみてくださいconst

static const char *const dict [] = { "a...", ...

これで、初期化されたデータセグメントに割り当てられます。プラットフォームとコンパイラ/リンカーの機能によっては、正常に機能する場合があります。

オペレーティングシステムは通常、このデータのキャッシュ/スワッピングを処理するため、データが本当に不変である場合は、これが推奨される方法です。

于 2012-07-19T19:21:52.303 に答える