配列の格納数について

解決


トーシロ  2004-11-26 02:25:50  No: 55351

プログラムを組む時に配列を用いているのですが、配列の格納数の上限はどれぐらいなのでしょうか?今、二次元配列を用いているのですが、A[500][500]ぐらいの配列を4、5個使おうとすると、ボタンを押して実行させようとするとエラーが起きてしまうのです。これらの配列を削除すると普通に実行できるのですが…。また配列をOnButtunの中でなく外に定義するとエラーがでなくなりましたが、これはどういうことなのでしょうか?こういうことはあるのでしょうか?Onbuttunの外に定義づけると配列の格納数の上限がクリアされたりするのでしょうか?どなたかお教えください。わかりにくい文章ですいません。


KING・王  2004-11-26 02:44:11  No: 55352

A[500][500]のサイズは、char型の配列と考えると、500×500=250,000バイト。
それを4つと考えると、250,000×4=1,000,000バイト(約1MB)

デフォルトのスタックのサイズが1MBなので、
おそらくスタック不足でしょう。
対策としては、以下の2つがあると思います。

(1)プロジェクトの設定で、スタックサイズを変更する。
(2)mallocなどで、動的にメモリを確保する。


KING・王  2004-11-26 06:00:15  No: 55353

補足します。
(当方、VC6を使用しているので、それを前提にしています。)

一般的に、ローカル変数は、スタックという領域に作成されます。
スコープを外れると、ローカル変数は解放されますが、同時に使用できるのは、
スタックのサイズにより制限を受けます。
(スタックを使用するのは、ローカル変数だけではありません。)

ここで、VC6のデフォルトのスタックのサイズが1MBと設定されています。
ここを変更するには、プロジェクトの設定のリンクタブで、カテゴリをアウトプットを選択すると、
スタックアロケーションという項目があり、そこで設定します。

> また配列をOnButtunの中でなく外に定義するとエラーがでなくなりましたが、
> これはどういうことなのでしょうか?

OnButtunの外というのがよくわかりませんが、おそらくグローバル変数として宣言したのであると思われます。

ここで、先にローカル変数はスタックという領域を使用すると書きましたが、
グローバル変数はスタックとは別な領域を使用します。
このグローバル変数が使用している領域の制限については、詳しくはしりませんが、
1MB以上あるようなので、そのため、配列をグローバル変数として宣言した場合は、
スタックのサイズの制限にひっかからなかったと思われます。
(staticな変数もスタックではない領域を使用します。)

先の返信で、mallocなどで動的にメモリを確保すると書きましたが、
malloc(new)などで、動的に確保した変数も、スタックではない領域を使用するため、
スタックサイズの制限はうけません。

以上で、よろしいでしょうか?

#識者の方々、誤りなどあればフォローをお願いします。


トーシロ  2004-11-26 20:17:06  No: 55354

返信ありがとうございます。やはり扱える容量が足りなかったのですね。グローバル変数に設定するとスタックサイズ以上の容量が扱えるとはしりませんでした。それとスタックサイズを変更できることも…。mallocで動的メモリを確保する方法が複雑(というか自分がややこしくて理解できないので…)なのでまずはスッタクサイズを変更してみます。丁寧な返信ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加