こうき@プログラミング初心者です。
今、VC++を勉強し始めたところですが、例えばサンプルの
プログラムで、
int a[100],b[100];
と宣言して、a,bの配列にループ文で数値を読み込ませることは出来るのですが、
これが例えば
int a[1000000], b[1000000];
とやると、ビルドするところまでは問題ないのですが、実行するところでは、
オーバーフローしてしまうのか、
xxxが原因で、xxx.exeを終了します
というメッセージが帰ってきてしまいます。
まさか配列の要素数に、int型とは関係のない(と思われる)制限があるとは
思えないのですが。
もしくは大きな要素数を設定するために、何かしなければいけないことがある
のでしょうか?
開発環境はVC++6.0、OSはWindowsXPです。
どなたかお教えください。
宜しくお願いします。
スタックの大きさはかなり限られたものです。
>int a[1000000], b[1000000];
これはintが4バイトだとしてこれだけで8Mになります。
多分スタックにおくには大きすぎます。
グローバルにおくか、
static int a[1000000], b[1000000];
としてスタティック領域に置くか、newとかで動的に確保してあげてください。
スタック領域というものをご存知でしょうか?
(詳しくはwebなどで調べてみてください。
たとえば
void func(void)
{
int hoge;
}
と関数内で宣言した変数は、ほぼ必ずスタックと呼ばれる
領域に作られます。そしてこの領域はWindowsではデフォルトで1MBです。
なので
int hoge[1000000];
は4000000バイトとなり1MBを超えてしまいますので
推測されてるようにスタックオーバーフローで
実行時エラーとなってしまうわけです。
これを回避するにはスタックサイズを変更するか、
malloc(or new)で動的にメモリ領域を確保するようにします。
#後者が実用的と思われます。
かぶった ^^;
#補足ですが ほぼ必ず、といったのは
#実装に依存するからです。
PAIさん、euro2004さん、ありがとうございました。
ご指摘の通り、newで動的にメモリ領域を確保することで
対応できました。