- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:二次元配列について)
二次元配列についての質問
このQ&Aのポイント
- プログラムにてNが100の時はコンパイル/実行が出来ますが、Nを1024にすると実行時エラーが発生します。
- 動作環境はPen4+Linux 2.4.20です。
- Cの文法的には正しいと思いますが、何がいけないのでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
これは、処理系のメモリの取り方に関係がある現象です。 C言語処理系(コンパイラ)が使うメモリは、いくつかに分類されます。 まず、プログラムコードがおかれる場所。 そして、データが置かれる場所があります。 大きく分けると、 ・定数データが置かれる場所。 ・静的変数(staticがついた変数、もしくはグローバル変数)がおかれる場所。 ・自動変数(関数の中で宣言される、staticがつかない変数)がおかれる場所。 の3種類あります。 問題の配列aaは、3番目の場所におかれますが、 この領域はそんなに大きくないのです。 配列が大きすぎて入らないのかもしれません。 staticをつけて、2番目の場所にすればエラーが起こらない可能性があります。 ただし、これもどうかわかりません。 1024*1024と言えば1メガバイトになりますが、 普通のPCメモリでは、そんなに一度にメモリをとれないかもしれないのです。 上記のどちらが原因であるか、 実験していないのでわからないため、 自信なしにしておきます。 場合によっては、1024*1024の配列を取るのはあきらめて、 構造体を作ってmalloc()でメモリを取ってアクセスします。 struct AA{ double *data[1024] }; AA aa; for(i = 0; i<1024; i++){ aa.data[i] = (double *)malloc(1024 * sizeof(double)); というような感じになります。 aaのデータにアクセスするのが多少面倒になりますが…。
お礼
>staticをつけて、2番目の場所にすればエラーが起こらない可能性があります。 これでできました。助かりました。ありがとうございます。 #スタック領域は狭いことは認識していたのですが、 OSが足りなかったら広げてくれるものだと思ってました。