• ベストアンサー

この数式でセグメンテーションエラーがでてしまいます

c言語でこの数式を入れるとコンパイルは可能なのですがセグメンテーションエラーが出てしまいます。 どこが間違えているのかご指摘お願いします。 w[j+1] = -1*w[j-1] + ( (2+h*h) * w[j] ) / ( 1+h*h*w[j]*w[j] ) + ( ( h*h*h*h*w[j]*w[j]*w[j] ) * ( 1-2*w[j]*w[j] ) ) /(1+h*h*w[j]*w[j] ) ; このような数式なのですがどこが間違えているのでしょうか?

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

#1さんが書かれていたとおり、配列の添字が範囲外になっているようです。 double w[1000001]; この定義で使える添字は0~1000000ですね。それに対し、 for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]) + ((dx*dx*dx*dx*w[j]*w[j]*w[j])*(1-2*w[j]*w[j]))/(1+dx*dx*w[j]*w[j]); } このループで、jが1000000のとき、w[1000001]にアクセスしようとしています。 これは配列の定義範囲外の領域です。何が起きても不思議ではありません。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#208507
noname#208507
回答No.5

#4です。 失礼。確かに#1,#3の言うとおり配列が範囲外になっていますね。 先ほどの回答はスルーしてください。

全文を見る
すると、全ての回答が全文表示されます。
noname#208507
noname#208507
回答No.4

原因は double w[1000001]; の部分ですね。 こんなに大きな配列をローカル変数におくと、スタック領域からあふれてしまいます。 static double w[1000001]; に直すか、callocなどでヒープ領域にメモリを確保すればセグメンテーションエラーを回避できます。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

提示された箇所でセグメンテーションエラーが出ているということが、 どのようにしてわかったのでしょうか。 なお、提示された部分「だけ」では、何が原因でどう対処すればいいかはわかりません。 配列w[]の定義や、提示された部分を実行している(と思われる)ループの書き方などの 情報も必要だと思います。

syachi05
質問者

補足

了解しました。プログラミングの全文をのせてみます。 #include<stdio.h> #include<math.h> int main(void){ int j; double dx = 0.5; double w[1000001]; double ww; w[0] = 0.000001; w[1] = 0.000001; for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]) + ((dx*dx*dx*dx*w[j]*w[j]*w[j])*(1-2*w[j]*w[j]))/(1+dx*dx*w[j]*w[j]); } for(j=0;j<=1000000;j++){ ww = (w[j+1]-w[j])/dx; printf("%lf %lf\n", w[j], ww); } return 0; } このようなプログラミングなのですがどこかおかしいところはありますか?

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

セングメンテーションエラーが出る、その場所で配列を使っている、ということから予想されることは ・添字が範囲外 ・そもそも配列として領域が確保されていない(ポインタに領域を設定せずに使う 等) がほとんどです。 変数jの範囲と、配列wの宣言を確認してください。 特にあやしいのは、j+1とj-1です。

syachi05
質問者

補足

そうなのですか、ありがとうございます。勉強します。 それでは #include<stdio.h> #include<math.h> int main(void){ int j; double dx = 0.5; double w[1000001]; double ww; w[0] = 0.000001; w[1] = 0.000001; for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]); } for(j=0;j<=1000000;j++){ ww = (w[j+1]-w[j])/dx; printf("%lf %lf\n", w[j], ww); } return 0; } このようなプログラミングのときはエラーが出ないのですが。 #include<stdio.h> #include<math.h> int main(void){ int j; double dx = 0.5; double w[1000001]; double ww; w[0] = 0.000001; w[1] = 0.000001; for(j=1;j<=1000000;j++){ w[j+1] = -1*w[j-1]+((2+dx*dx)*w[j])/(1+dx*dx*w[j]*w[j]) + ((dx*dx*dx*dx*w[j]*w[j]*w[j])*(1-2*w[j]*w[j]))/(1+dx*dx*w[j]*w[j]); } for(j=0;j<=1000000;j++){ ww = (w[j+1]-w[j])/dx; printf("%lf %lf\n", w[j], ww); } return 0; } このようなプログラミングのときはエラーが出てきてしまうのですがどこがおかしいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • セグメンテーション違反とは??

    linuxでC言語のプログラムを構築しています。 gccでコンパイルしたときにセグメンテーション違反という エラーが出てしまいます。 セグメンテーション違反とは一体なんの ことなんでしょうか? メモリのことだと思ってるんですが、原因がよくわかりません。C言語初心者なので わかりやすく教えて頂けるとありがたいです。

  • セグメンテーションエラー

    初めまして。 余り詳しくないのですが、Cでバイナリファイルを読み込み、10分ごとにDBに書き込む永久ループのプログラムを作っています。 コンパイルも出来て、動くのですが、3回ぐらい書き込むと セグメンテーションエラーで止まります。時には、6-7回書き込めたりします。 DBに書き込むところを省いても、エラーが出てしまうのですが、どのような部分を調べていったらいいですか?

  • セグメンテーション違反について

    C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。

  • セグメンテーション違反

    C言語を使用しています。 構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に 「セグメンテーション違反です (core dumped)」 となってしまい、それ以上行えません。 構造体と代入したい変数との型は、合っています。 いろいろ本などで見ましたが、何が原因かわからず困っています。 教えてください。 宜しくお願いします。

  • セグメンテーションエラー

    C++ on Vine (バージョン共にわからず)です。 セグメンテーションエラーは、メモリの領域破壊の時にでるようですが、 その他の原因はありますか? また、メモリの領域破壊とは、 配列の要素数以上に要素を詰め込もうとしたとき 以外の要因はありますか? ポインタを使えばいろいろ破壊できそうですが、 そういうのはなしで。

  • fclose()でセグメンテーション違反

    C言語でのファイル読み込みで、ファイルを開いてデータを読み込んで表示することはできたのですが、最後のfclose(fp)でセグメンテーション違反になります。一番最後のwhileループをコメントアウトしたところセグメンテーション違反にはならなかったので、ここに何か問題があると思うのですが、どこが悪いのかが分かりません... #include<stdio.h> #include<stdlib.h> main(void){ FILE *fp; int i=0 , j=0 ,cnt = 0 , c=0; char *name="data.txt"; float *buf1,*buf2; if((fp = fopen(name,"r")) == NULL){ printf("error\n"); return 0; } else{ while((c = getc(fp)) != EOF) { if(c == '\n') cnt++; } printf(">>%d<<\n",cnt+1); rewind(fp); buf1 = (float *)malloc( (int)(cnt/2) +1); buf2 = (float *)malloc( (int)(cnt/2) +1); /*ここからがおかしい?*/ while(1){ if( fscanf( fp ,"%f %f",&buf1[i],&buf2[i])==EOF )break; printf("%f %f\n",buf1[i],buf2[i]); i++; } fclose(fp); } return 0; } なぜセグメンテーション違反になっているのでしょうか?

  • セグメンテーション違反

    OSはリナックスでC言語です。 #include<stdio.h> #include<stdlib.h> typedef struct{ int id; char *name; }user; int main(void) { user *users; int i,j; users=(user *)malloc(sizeof(user)*100); for(j=0;j<5;j++) scanf("%d",&(users+j)->id); scanf("%s",(users+j)->name); free(users); printf("input your id;"); scanf("%d",&i); printf("NO%d %s\n",(users+i)->id,(users+i)->name); return 0; } 上記のプログラムソースでセグメンテーション違反と出てしまいます。 原因はなんなのでしょうか。 教えていただければ光栄です。

  • 「セグメンテーション違反」について

    参考書に載っていたプログラムを打ち込みながら勉強していたのですが、次のプログラムを動かしたときに「セグメンテーション違反」と出てきました。 /* 可変書式による印字_簡単な棒グラフ */ #include <stdio.h> main() { char *f, *a; int i; f="%2d = %-20.1s\n"; a="********************"; for(i=1; i<10; i++){ *(f+11)=i+'0'; printf(f,i,a); } } コンパイル後に、 「セグメンテーション違反です」 と、表示されて終わってしまいます。 何処が問題だったのでしょうか???教えて頂ければ幸いです。

  • セグメンテーションエラーです

    行列の積の計算のプログラムです #include <stdio.h> #include <math.h> #define MN 1200 int main() { double A[MN][MN],B[MN][MN],C[MN][MN]; int i,j,k; double an=0,am=0,bn=0,bm=0; FILE *fp1; FILE *fp2; FILE *fp3; fp1 = fopen("1200A.dat", "r"); for(i=0;i<am;i++){ for(j=0;j<an;j++){ fscanf(fp1,"%lf",&A[i][j]); } } fclose(fp1); fp2=fopen("1200B.dat","r"); for(i=0;i<bm;i++){ for(j=0;j<bn;j++){ fscanf(fp2,"%lf",&B[i][j]); } } fclose(fp2); for(i=0;i<am;i++){ for(j=0;j<bn;j++){ C[i][j]=0.0; for(k=0;k<bm;k++){ C[i][j]+=A[i][k]*B[k][j]; } } } fp3=fopen("ans1200C.dat","w"); for(i=0;i<am;i++){ for(j=0;j<bn;j++){ fprintf(fp3,"%lf ",C[i][j]); } fprintf(fp3, "\n"); } fclose(fp3); return 0; }

  • 配列の要素数を超えた参照のコンパイル

    C言語においては”配列の要素数を超えての参照もコンパイルエラーにはならない”という事がいえます。 例えば int a[10]={1}; とした時、a[-1] a[11]を参照しても、コンパイルエラーにはなりません。不定値が表示されるか、Red Hat Linuxに関しては”セグメンテーション違反です”とでるだけです。 しかし、わたしはCしか学んではいませんので解りませんが、配列の要素数を超えての参照はコンパイルエラーになる言語もあるのではないかと思います。 C言語はよく”暴走する言語”と言われます。規制をできる限り排除して軽くし、ミスはプログラマが取るという意味に考えています。 ”C言語においては配列の要素数を超えての参照もコンパイルエラーにはならないという事”はC言語のその様な設計思想に基ずいた仕様なのでしょうか。 それとも、違う考えに基ずいて、”配列の要素数を超えての参照もコンパイルエラーにはならない”という事に成っているのでしょうか。 宜しく願います。

PCの買い替えに伴う作業
このQ&Aのポイント
  • PCを買い替えた際の作業方法について教えてください
  • 古いPCでアカウントを消去せずに新しいPCに移行する方法はありますか?
  • ソースネクスト株式会社の製品・サービスについて詳しく教えてください
回答を見る