• ベストアンサー

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を使っています。 解決方法を教えていただけないでしょうか。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.8

デフォルトスタックサイズは1MBでしたか。存じませんでした。 スタックオーバーフローなら対策はスタックを使わないようにすること。 てことで、さくっとやっときました。 #include <stdio.h> #include <math.h> #include <stdlib.h> // 追加 #define x 100000 #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 *pA, *pB; // double A[x+1]; // double B[x+1]; if(NULL == (pA = (double *)calloc( x+1, sizeof(double))) ){ perror("pA のメモリ確保失敗"); return; } if(NULL == (pB = (double *)calloc( x+1, sizeof(double))) ){ perror("pB のメモリ確保失敗"); return; } for(i=0;i<=x;i++) { pA[i]=(i+y)*z; pB[i] = exp(-(h*hE*c*cE)/(pA[i]*k*kE*1000)); if(i%1000==0) // 間引いて表示 printf("%e %e\n",pA[i],pB[i]); } return; } やったことは、スタックじゃなくてヒープからメモリを確保しただけ。 動作確認済み。 でも。ループ10万回っていう設計はセンスが悪い気がします。

b-man
質問者

お礼

いろいろと丁寧に教えていただき、ありがとうございます。 自分の勉強不足を痛感するのと同時に、原因が分かってすっきりしました。

その他の回答 (7)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.7

VCのデフォルトスタックサイズは1MBですからオーバフローしますね。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.6

8バイト*100000≒800KB 2個分で1600KB≒1.6MBくらいなら、いけそうな気もします。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.5

あのー? 考えてます? double型機種依存だと思いますが8バイトは最低でも確保されますよね? 8バイト*100000=80Mb位になるんじゃないの? その配列2つで160Mbですよね? Visual C++ 6.0でコンパイルもしくはリンクオプション付けないで、大きなメモリエリアは確か私の記憶では、確保出来ません。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

Borand C++ Compiler 5.5で同様の現象を確認しました。 下記の変更で動きました。試してみてください。 スタックが足りないのかな。 void main(void){ int i; static double A[x+1]; static double B[x+1];

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

ANo.1の方が >int i;では、 iの値が-32768~32767までしかもてません。 と書かれていますが、これは勘違いです。というのはint型のサイズは処理系依存で、16bitという保証が無いからです。 Visual C++ 6.0のヘルプで int型のサイズを確認すると、int型のサイズは4バイト(=32bit)と記載されていました。ですから、とりうる値の範囲は -2147483647-1~2147483647 です。(これはlongのとりうる値の範囲と同じです。)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

動かなくなってしまう、とは具体的にどのようになるのでしょうか? > 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回もまわるのですから、重たいprintfが繰り返されてコンソールにだ~~~~と文字列が流れて操作を受け付けないであろうことは想像できます。printfを100回に1回とか、1000回に1回に間引けば軽くなるでしょうね。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

int i; では、iの値が-32768~32767までしかもてません。for文の中でエラーになります。 long型にしたらどうでしょう?

関連するQ&A

専門家に質問してみよう