- ベストアンサー
2次元配列でエラーがでます。
VC++を使ってプログラムを書いています。2次元配列で配列を大きくするとエラーが出てしまいます。1次元配列の場合は今のところ特にエラーは出ない感じです。プログラムにもよりますが、小さい配列でa[300][300]くらいでエラーが出てしまいます。だいたい配列をa[10000][10000]くらい取りたいのですが。このエラーを解消する方法はないでしょう?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #include <malloc.h> //1000個のintの配列の型をARRAY1K型と定義 typedef int ARRAY1K[1000]; void main(){ //ARRAY1K型の配列へのポインタは //ARRAY1Kの1000個の配列の先頭アドレス ARRAY1K *a = (ARRAY1K*)malloc(sizeof(ARRAY1K) * 1000); ARRAY1K *b = (ARRAY1K*)malloc(sizeof(ARRAY1K) * 1000); ARRAY1K *c = (ARRAY1K*)malloc(sizeof(ARRAY1K) * 1000); } これで1000x1000の配列a、b、cができあがります。 配列のポインタとポインタのポインタ、ポインタの配列など、ごちゃごちゃになりやすいので、わからなくなったらこのようにtypedefを作ることです。 HeapAllocについては、私は知りません、ごめんなさい。
その他の回答 (4)
- toysmith
- ベストアンサー率37% (570/1525)
VC++では268435456バイトを超えるデータ領域を持つプログラムは作成できません。 a[10000][10000]だと、配列要素数は100000000個なので、int型だともうオーバーですね。 動的に確保しましょう。 あまりにでかい配列の場合はmalloc()じゃ危ないです。 HeapAlloc()を使った方がいいでしょう。
お礼
ご回答ありがとうございました。
- haporun
- ベストアンサー率40% (230/562)
そこまで大きいやつは動的に確保しましょうよ。 #include <stdio.h> #include <malloc.h> typedef int ARRAY10K[10000]; void main(){ ARRAY10K *array10Kx10K = (ARRAY10K*)malloc(sizeof(ARRAY10K) * 10000); }
補足
ご回答ありがとうございます。 C言語は超初心者であるため、根本的に何をやっているのか分かりません。 例えば配列を、a[1000][1000],b[1000][1000],c[1000][1000]ととりたい場合はどうしたらよいでしょうか? よろしくお願いします。
- a-kuma
- ベストアンサー率50% (1122/2211)
エラーの中身くらい書きなさいって。 プロジェクトの設定の中からリンクの設定でスタックサイズを大きく指定してください。 もしくは、配列が static でも構わないのであれば、static int a[10000][10000] みたいに するのが安直かも。 # VC1.0 ならいざしらず、いまどき small モデルやら near ポインタなんて話は無いですぜ >hinebot # なんて言って、実は、VC1.0 のことだったり (^^;
お礼
ご回答ありがとうございます。 エラーの内容は、びっくりマークがでて「(ファイル名)が原因で、(ファイル名).EXEにエラーが発生しました。」と出て、右の方に"閉じる"と"デバック"が表示されます。 >>プロジェクトの設定の中からリンクの設定でスタックサイズを大きく指定してください。 スタックサイズを大きく指定するとはどういうことでしょうか?スタックサイズという言葉自体見つからないのですが。。 よろしくお願いします。
- hinebot
- ベストアンサー率37% (1123/2963)
ポインタで扱えるオフセット量をオーバーしているんじゃないでしょうか。 具体的な対処法は分りませんが、ヒントにでもなればと思いまして。 (16ビット処理系で、nearポインタだと0xFFFF[=65535]までです。 a[300][300] だと、300×300 = 90000 ですよね。)
お礼
ご回答ありがとうございました
お礼
ご回答ありがとうございました。 無事解決しました。