配列に設定する要素数には制限がある? – プログラミング – Home

配列に設定する要素数には制限がある?
 
通知
すべてクリア

[解決済] 配列に設定する要素数には制限がある?


こうき
 こうき
(@こうき)
ゲスト
結合: 19年前
投稿: 2
Topic starter  

こうき@プログラミング初心者です。

今、VC++を勉強し始めたところですが、例えばサンプルの
プログラムで、

 int a[100],b[100];

と宣言して、a,bの配列にループ文で数値を読み込ませることは出来るのですが、
これが例えば

 int a[1000000], b[1000000];

とやると、ビルドするところまでは問題ないのですが、実行するところでは、
オーバーフローしてしまうのか、

 xxxが原因で、xxx.exeを終了します

というメッセージが帰ってきてしまいます。

 まさか配列の要素数に、int型とは関係のない(と思われる)制限があるとは
思えないのですが。
 もしくは大きな要素数を設定するために、何かしなければいけないことがある
のでしょうか?

 開発環境はVC++6.0、OSはWindowsXPです。

 どなたかお教えください。
 宜しくお願いします。


引用未解決
トピックタグ
PAI
 PAI
(@PAI)
ゲスト
結合: 20年前
投稿: 359
 

スタックの大きさはかなり限られたものです。

>int a[1000000], b[1000000];

これはintが4バイトだとしてこれだけで8Mになります。
多分スタックにおくには大きすぎます。

グローバルにおくか、
static int a[1000000], b[1000000];
としてスタティック領域に置くか、newとかで動的に確保してあげてください。


返信引用
euro2004
 euro2004
(@euro2004)
ゲスト
結合: 20年前
投稿: 37
 

スタック領域というものをご存知でしょうか?
(詳しくはwebなどで調べてみてください。
たとえば

void func(void)
{
int hoge;
}

と関数内で宣言した変数は、ほぼ必ずスタックと呼ばれる
領域に作られます。そしてこの領域はWindowsではデフォルトで1MBです。

なので
int hoge[1000000];
は4000000バイトとなり1MBを超えてしまいますので
推測されてるようにスタックオーバーフローで
実行時エラーとなってしまうわけです。

これを回避するにはスタックサイズを変更するか、
malloc(or new)で動的にメモリ領域を確保するようにします。

#後者が実用的と思われます。


返信引用
euro2004
 euro2004
(@euro2004)
ゲスト
結合: 20年前
投稿: 37
 

かぶった ^^;

#補足ですが ほぼ必ず、といったのは
#実装に依存するからです。


返信引用
こうき
 こうき
(@こうき)
ゲスト
結合: 19年前
投稿: 2
Topic starter  

PAIさん、euro2004さん、ありがとうございました。
ご指摘の通り、newで動的にメモリ領域を確保することで
対応できました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました