- 締切済み
メモリ確保方法を教えてください。
Visual Studio.NET でC言語でプログラムを組んでいるのですが、二次元配列をたくさん使用したプログラムで、コンパイルして実行しようとするとエラーが表示されてしまいます。配列の要素を少なくすると実行はされるのですが、要素数が多くなるとエラーが表示されます。 実行時にユーザの使用メモリ数が制限されているなら、その使用メモリを増やす方法があれば教えていただけませんか?よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ちょっと補足説明を スタックというのは、一時的な変数や、 関数の戻り先、戻り値などで使われます。 もともと大量のメモリを確保するというような使われ方を意図していません。 ヒープというのは、例えば、文字列定数のような 例えば char message[]="こんにちは"; のようなものをコンパイル時に確保しておく場所というかメモリというかそんなものです。 グローバル変数にすることで、ヒープに確保されるというのは、存在期間が一時的でないからです。 でもそうすると、プログラムのどこからでも見えてしまうので、スコープ(変数の参照できる範囲)を限定するには、staticをつけます。 例えば、 int callCount(void){ static int count=0; return (++count); } の様にすると、callCountの中のcountという変数は、他からは見えず、この関数が終了しても、値が残っていて、関数が呼ばれるたびに、呼ばれた回数をカウントします。 同じように配列でも static double array[5000]; というように宣言することで、 double型の変数が5000個分の領域がヒープに(一時変数でないので)確保されます。 以上のような確保は、コンパイル時に領域が確保されますが、 mallocなどの関数は、C言語で、動的にメモリをヒープから確保します。 C++言語では、newがだいたい(おおざっぱな話ですが)これ(malloc)にあたります。
- JaritenCat
- ベストアンサー率37% (122/322)
普通はヒープ領域を使えばなんとかなりそうですが、int(32bit)の上限が4Gなので配列サイズがギガバイトオーダーになるのであれば普通の方法では困難と思われます。。。ファイルを併用するとか。
- sha-girl
- ベストアンサー率52% (430/816)
一番簡単な方法はその配列をグローバルにすればヒープ領域になります。 普通C言語ならmalloc realloc calloc free等の メモリー確保、開放の関数を使います。
お礼
ヒープ領域というものがよくわからなかったのですが、変数配列をグローバルで宣言すると実行することができるようになりました。本当に助かりました。どうもありがとうございます。これからも多々質問することがあると思いますがよろしくお願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
スタックに格納されるような配列を確保しているのではないでしょうか? 標準では、スタックサイズは1MB程らしいので、 スタックサイズを大きくする必要があります。 コンパイルオプション /F 確保したい数字 でスタックサイズを変更できます。 MSのヘルプより Visual Studio 開発環境でこのコンパイラ オプションを設定するには プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。 [C/C++] フォルダをクリックします。 [コマンド ライン] プロパティ ページをクリックします。 [追加のオプション] ボックスにコンパイラ オプションを入力します。 --------------------------- どちらかというと、スタックに確保するよりヒープに確保した方がいいです。 newで確保するか、 staticで確保できると思います。
お礼
丁寧に質問に答えていただきありがとうございます。 少し答えていただいた内容が私には難しかったのですが、丁寧に答えていただいてとてもうれしいです。 また何か質問することもあると思いますのでよろしくお願いします。
お礼
丁寧に質問に答えていただきありがとうございます。 少し答えていただいた内容が私には難しかったのですが、丁寧に答えていただいてとてもうれしいです。 また何か質問することもあると思いますのでよろしくお願いします。