• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:二次元配列について)

二次元配列についての質問

このQ&Aのポイント
  • プログラムにてNが100の時はコンパイル/実行が出来ますが、Nを1024にすると実行時エラーが発生します。
  • 動作環境はPen4+Linux 2.4.20です。
  • Cの文法的には正しいと思いますが、何がいけないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.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のデータにアクセスするのが多少面倒になりますが…。

mahmah
質問者

お礼

>staticをつけて、2番目の場所にすればエラーが起こらない可能性があります。 これでできました。助かりました。ありがとうございます。 #スタック領域は狭いことは認識していたのですが、 OSが足りなかったら広げてくれるものだと思ってました。

関連するQ&A