プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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万回っていう設計はセンスが悪い気がします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/05 22:31

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

    • good
    • 0

8バイト*100000≒800KB


2個分で1600KB≒1.6MBくらいなら、いけそうな気もします。
    • good
    • 0

あのー?


考えてます?

double型機種依存だと思いますが8バイトは最低でも確保されますよね?

8バイト*100000=80Mb位になるんじゃないの?
その配列2つで160Mbですよね?
Visual C++ 6.0でコンパイルもしくはリンクオプション付けないで、大きなメモリエリアは確か私の記憶では、確保出来ません。
    • good
    • 0

Borand C++ Compiler 5.5で同様の現象を確認しました。


下記の変更で動きました。試してみてください。
スタックが足りないのかな。

void main(void){
int i;
static double A[x+1];
static double B[x+1];
    • good
    • 0

ANo.1の方が



>int i;では、 iの値が-32768~32767までしかもてません。

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

動かなくなってしまう、とは具体的にどのようになるのでしょうか?



> 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回に間引けば軽くなるでしょうね。
    • good
    • 0

int i;


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!