• ベストアンサー
※ 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

  • 2次元配列

    大学の課題なのですが 10×10の2次元配列に、平面のビットパターンが入っているとする(0と1の整数が入っているとする)。左右反転して出力しなさい。 という問題で、自分は以下のプログラムを作ったのですが、うまくうごいてくれません。だれか間違いを指摘していただけないでしょうか。 よろしくお願いします。 #include<stdio.h> int main(void) { int i,j; int data[10][10]={0,1}; for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%3d",data[10-i][10-j]); } printf("\n"); } return(0); }

  • 二次元配列に関する質問です。

    一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか?

  • 2次元配列にポインタを格納

    http://www.okweb.ne.jp/kotaeru.php3?q=505241の訂正版の質問です。 VC++6.0を使っております。 下のようなプログラムを作ってみました。 #include <stdio.h> #include <vector> using namespace std; class c{ public: c(); virtual ~c(); int get(){return j;}; void set(int i){j=i;}; private: c(const c &right); const c &operator=(const c &right); int j; }; void main(){ vector <vector<c*> > a; c *b; for(int n=0;n<10;n++){ for(int i=0;i<10;i++){ b=new c; a[n].push_back(b); } } for(int j=0;j<10;j++){ for(int i=0;i<9;i++){ a[i][j] -> set(i+j); } } for(j=0;j<10;j++){ for(int i=0;i<9;i++){ printf("%d ",a[i][j] -> get()); } printf("%d\n",a[9][j] -> get()); } for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ delete a[i][j]; } } } すると、コンパイルには成功するのですが、実行は出来ません。 その理由は、「外部参照1が未解決」だそうです。 アドバイスをお願いいたします。

  • 二次元配列の対各成分を書き出すプログラムについて

    実行結果が3,5,7を書き出すプログラムを作成したいです。1,5,9を書き出す(以下のプログラム)を書き出すものは出来たのですが、3,5,7を書き出すプログラムが解りません。誰か解る方、教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6},     {7,8,9}}; for(i=0;i<3;i++){ printf("%d",mt[i][i]); } printf("\n"); return(0); }

  • 二次元配列についての質問です。

    1~9の数字を9,8,7,6,5,4,3,2,1と出力するようなプログラムを作成しているのですが、解りません。一応ある程度(以下のプログラム)出来たのですが、何処をどう直せばいいか解りません。何処を直せばいいか教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6}, {7,8,9}}; for(i=0;i<3;i++){ printf("%3d",mt[i][i]); } printf("\n"); return(0); }

  • 2次元配列の基礎について

    とある問題で 下に示す行列x,yの積を求めるプログラムを作成せよ。 x=[123][456] y=[15] [53][81] 問題の意味が自分にはよくわからないのですが この場合 123*15;123*53;123*81 456*15;456*53;456*81 の解答を表示させればいいのでしょうか? 自分でやったら以下のようになりましたが、これだと456*53と123*15と0しか表示されません。どこをどう直せば宜しいでしょうか? ご教授お願いしますm(__)m #include <stdio.h> int main(void){ int ma[3][1] ={{123},{456}}; int mb[3][1] ={{15},{53},{81}}; int mc[3][1] ={0}; int i; int j; for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ mc[i][j] =ma[i][j] * mb[i][j]; } } for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ printf("%3d",mc[i][j]); putchar('\n'); } } return 0; }

  • 一次元配列についてです

    配列matを以下の様に宣言し、連続した3つの数の和を順に書き出すプログラムを作成しています。が、条件式とprintfの出力の仕方が全く解りません。この二つが解る方、教えて頂けませんか。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { } printf("\n"); return(0); }

  • C言語の実行について、

    #include <stdio.h> #define N 2 void main(void) { int i ,j ; for( i=1 ; i <= N ; ++i) { for( j=i ; j < N+2 ; ++j) { printf("j=%d\n",j); } printf("i=%d\n",i); } } を実行すると、 j=1,j=2,j=3,i=1,j=2,j=3,i=2となったんですが、 どういった順序で行われているのでしょうか? よろしくお願いします。

  • 【C言語】フィボナッチの配列について

    フィボナッチの配列を表示するプログラムについてご質問でございます。 F[i]の計算というプログラムでございます。但し、F1=F2=1,n>2のとき、Fn-1+Fn-2=Fnでございます。 #include<stdio.h> #define N 10 int main() { int i,F[N+1]; / F[i]の計算 / for(i=1;i<=N;i++){ printf("%d\n", F[i]); } } この内、「/ F[i] の計算 /」の部分が分からず、困っております。 教えて頂けたら幸いです。

  • 2次元配列

    課題で、氏名をローマ字で入力し、2次元配列に格納するプログラムを作成するというのがでました。条件として、氏名の長さは10文字以下、最大件数は10件。1エントリ入力ごとに累計件数を表示し、10件目の入力が完了するか、氏名の一文字目に'0'が入力されたら入力を終了しデータを表示する。11文字以上入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。 改行のみの入力の場合、エラーメッセージを表示し、再入力させる。 初心者の私には、データの表示と、条件の処理の仕方がわかりません。 下記プログラムを上記の条件を満たすようにするには、どこを直したらよいか教えてください。 お願いします。 #include <stdio.h> #include <string.h> #define BUFFERSIZE 1024 main() { char str[10][BUFFERSIZE]; char c; int count = 0; int i; int j; int l[10]; /*氏名の入力*/ for (i = 0; i < 10; i++) { printf("氏名人力 : "); while ( (c = getchar()) != '\n' ) { if( count < BUFFERSIZE - 1 ){ str[i][count++] = c; } } str[i][count] = '\0'; printf("累計 : %d \n", i+1); } for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%c",str[i][j]); } putchar('\n'); } return 0; }