VC++6.0での配列の動作不良

このQ&Aのポイント
  • 現在、VC++6.0のWin32 Console Applicationプロジェクトでプログラムを書いているのですが、配列の様子がおかしいです。AとSのfor文はまったく同じで、SかわりにAを使うと、エラーは生じません。
  • 具体的に言うと、ヘッダで#define N 10、#define NN (2*N*2*N)と配列を宣言しているのですが、A,B,Cそれぞれの配列への値の書き込みは普通に行えるのですが、Sに値を書き込んでいる最中にプログラムが強制終了してしまいます。
  • またヘッダで、#define N 10、#define NN 400とNNを数字で表すとこのエラーが生じず、普通に実行されます。なぜこのようなことが起こるのでしょうか?
回答を見る
  • ベストアンサー

VC++6.0での配列の動作不良

現在、VC++6.0のWin32 Console Applicationプロジェクトでプログラムを書いているのですが、配列の様子がおかしいです。 具体的に言うと、ヘッダで #define N 10 #define NN (2*N*2*N) double A[NN+1][NN+1],S[NN+1][NN+1]; double B[NN+1],C[NN+1]; と配列を宣言しているのですが、A,B,Cそれぞれの配列への値の書き込みは普通に行えるのですが、 Sに値を書き込んでいる最中にプログラムが強制終了していまします。エラーメッセージなどはでません。 デバッグすると、Sに値を書き込むfor文の繰り返しの最後のほうに バンドルされていない例外は***.exeにあります。0xC0000005:Access Violation というメッセージが出てそこでプログラムが終了してしまいます。なぜでしょうか? AとSのfor文はまったく同じで、SかわりにAを使うと、このエラーは生じません。 またヘッダで、 #define N 10 #define NN 400 double A[NN+1][NN+1],S[NN+1][NN+1]; double B[NN+1],C[NN+1]; とNNを数字で表すとこのエラーが生じず、普通に実行されます。なぜこのようなことが起こるのでしょうか? どなたか教えていただければ幸いです。お願いします。

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

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

締め切られていないようなので補足しますと。 --- auto変数にてスタックに領域を確保する場合は linkパラメータでstack領域を増やすことで解決します。が、お薦めしません。 一時的に領域を確保し、計算終了後に領域を解放するのであれば、malloc(or new)で確保、free(or delete)で解放が望ましいです。

その他の回答 (1)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

配列はどこで宣言されていますか? 関数内に宣言しているのであれば、スタックオーバーフローの可能性があります。static で領域を確保するようにしてみてください。

asamaken
質問者

お礼

ご回答ありがとうございます。 おっしゃるとおりオーバーフローしているようでした。 staticで宣言するとうまくいきました。 ありがとうございました。

関連するQ&A

  • defineで範囲指定した文字配列について

    こんにちは。C言語初心者です。 文字の配列で下のようなプログラムを作ったとき、入力の際にdefineで指定したN以上の文字数の文字列を入力した場合、その後のプログラム次第で実行が正しかったり、セグメントエラーがでたりします。 コンパイルする際はエラーがでません。 ※その後のプログラムとは、関数strcmpやstrcpyです。 #include <stdio.h> #define N 10 main() { char a[N];   char b[N]; scanf("%s %s", a, b); printf("%s\n", a); printf("%s\n", b); }

  • 配列の確保の仕方

    C言語でプログラムを記述していますが、 確保している配列が多すぎるためか、 access vilation at ・・・ などのエラーが出ます。 <プログラム> #define A 1000 #define B 10000 をグローバルで宣言して、各関数内でこれを用いて宣言しています。 int data[A][B]; double root[A][B];   ・   ・   ・ int score[A][A][B]; などを初めにたくさん宣言しています。 聞くところによると、動的に確保すればいい、とも聞いたんですが、あまり意味がわかりません。 上のエラーメッセージが出ないようにするにはどうすればいいのでしょうか? この説明だけでお分かりいただけないなら、言っていただければ詳しく言います。

  • 二次元配列について

    二次元配列が確保(?)されてなくて困っています。 プログラム内で、以下のように宣言するのですが、 #define MM 1025 //プログラム6行目 #define NN 10 //7行目 double y[MM][NN]; //17行目 y[0][0] = 3.0; //28行目 Visual Studio.NET のデバッグツールの「ウォッチ」で、 y[0][0]に代入された値を確認しようとすると、 エラー:インデックス'0'は、ポインタ/配列'y'の範囲外にあります と、表示され、中身を確認することができません。 それどころか、プログラムの後半98行目を境に、 y[0][0]の値が上書きされてしまいます。 x[k] = x[0] + k*h; //98行目 ここから、察するにメモリがちゃんと確保されていないと、 思うのですが、どうすればいいかわからず、困っています。 どなたかご教授をお願いいたします。 環境 OS : Windows XP 開発環境 : Visual Studio.NET

  • VC2010の開発

    VC++(2010)でプログラミングを行っています。 #define A1 (String型) #define A2 (Int32型) #define A3 (Int32型) #define B1 (String型) #define B2 (Double型) #define B3 (Double型) #define C1 (String型) #define C2 (Double型) #define C3 (Double型) 上記のようなA、B、C(型が異なる)をリストで管理したいです。 イメージとしては XX list = {{A1, A2, A3}, {B1, B2, B3},{C1, C2, C3}} です。 テンプレートクラスで実装できますか? また、別な方法があれば教えてください。

  • 2次元配列の動的確保について

    共分散行列を2次元配列に格納しようとしているのですが、 その要素は、左下半分と右上半分が同じになるため 対角要素と、どちらか半分だけを格納してメモリを節約したいと考えています。 以下のように動的確保することでメモリは節約できているでしょうか? if( (a = (double **)malloc(sizeof(double *) * (N) ))==NULL ){ fprintf(stderr, "error malloc for a\n"); exit(0); } for( i=0; i<NN; i++ ){ if( ( a[i] = (double *)malloc(sizeof(double) * (i+1) ))==NULL ){ fprintf(stderr, "error malloc for a\n"); exit(0); } } *節約しない場合は、i+1 が N になります。 確保できているのなら、どのように参照すればいいのでしょうか?データの並び(?)は、a[0][0],a[1][0],a[1][1],a[2][0],a[2][1],a[2][2],,,というように並んでいるでしょうか? 例えば、a[0][1]を参照しようとすると、シグメンテーションフォルトなど起こりうるでしょうか。必要であれば、上プログラム内Nは、3000程度と考えてください。 そして、もし他にメモリを節約する上で良い方法があれば、ご教授していただけたらと思います。 よろしくお願い致します。

  • 配列

    適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

  • C言語 配列の確保

    はじめまして。C言語の勉強を最近始めたのですが、 以下のプログラムで教えていただきたい点があります。 #include <stdio.h> #include <math.h> #define x 10000 #define y 200000 #define z 1.0E-12 #define k 1.38 #define kE 1.0E-23 #define h 6.63 #define hE 1.0E-34 #define c 3.00 #define cE 1.0E+08 void main(void){ int i; double A[x+1]; double B[x+1]; for(i=0;i<=x;i++) { A[i]=(i+y)*z; B[i] = exp(-(h*hE*c*cE)/(A[i]*k*kE*1000)); printf("%e %e\n",A[i],B[i]); }} このプログラムで、xを100000にするとプログラムが動かなくなってしまいます。OSはWindowsXP、ソフトはVisual C++ 6.0を使っています。 解決方法を教えていただけないでしょうか。

  • c言語 配列

    関数の中で複数の値を配列で返したいのですが,どうすればいいでしょう? 配列を関数に渡す時にはアドレスが渡されるので,ポインタと同様関数内で値を変えればmain関数の値も変わるのではないかと思ったのですが,上手くいきません. 知りたいのは,main関数の中の配列(できれば2次元配列)の値を他の関数から値を変更する方法です.下のプログラムはためしに書いてみたものです.質問を理解するうえで役立てば幸いです. #include<stdio.h> void func(double aaa[][3] ,double bbb[]); void main(void){ double array_a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; double array_b[3]={0}; func(array_a,array_b); } void func(double aaa[][3] ,double bbb[]) { int i,j; for (i=0;i<3;i++) { for (j=0;j<3;j++) { bbb[i]=bbb[i]+aaa[i][j]; } } }

  • C言語、配列、動的にメモリを割り当て

    すみません。お助けください。 動的なメモリの割り当てによって配列を複数作るときに、メモリを割り当てるルーチンを外部関数化したいのですが、うまくいきません。 具体的にはつぎのような感じです。 b[2] に 値を代入するときに Segmentation fault(core dumped) になってしまいます。 正しくは、どのようにすればよいのでしょうか。 よろしくお願いたします。 main() { int n=5; double *a, *b; mymalloc( a, n ); mymalloc( b, n ); a[2] = 3.5; printf( "%f\n", a[2] ); b[2] = 4.4; printf( "%f\n", b[2] ); } int mymalloc(double *c, int n) { c = (double *)malloc( n * sizeof(double)); }

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。