*fa=(*func)(*ax);の実行でSegmentation faultが発生する理由

このQ&Aのポイント
  • プログラムtest2.cでvalue=(*func)(*ax)という処理が正常に実行された結果、期待する答え225.0を得ることができました。
  • しかし、test3.cで*fa=(*func)(*ax)という処理を行ったところ、Segmentation fault(セグメンテーションフォルト)が発生しました。
  • test3.cの*fa=(*func)(*ax)は、関数mnbrakの定義内の記述に従っていますが、なぜエラーが発生するのでしょうか。
回答を見る
  • ベストアンサー

*fa=(*func)(*ax)

何度もすみません. 次のようなプログラムtest2.cを作成してみました. /* test2.c */ #include <stdio.h> float quad(float alf) { float z; z=(10.0+alf*5.0)*(10.0+alf*5.0); return z; } int main() { float* ax; float value; float* fa; float alpha; float (*func)(float); alpha=1.0; ax=&alpha; fa=&value; func=quad; value=(*func)(*ax); printf("value=%f\n",value); printf("*fa=%f\n",*fa); return 0; } これについては,先ほどのBLUEPIXYさんに助けられて,期待する答え225.0を得ることができました. そこで今度は「value=(*func)(*ax);」を「*fa=(*func)(*ax);」に変えて,test3.cを作成して実行したところ,「Segmentation fault」となりました.以下はtetst3.cです. /* test3.c */ #include <stdio.h> float quad(float alf) { float z; z=(10.0+alf*5.0)*(10.0+alf*5.0); return z; } int main() { float* ax; float* fa; float alpha; float (*func)(float); alpha=1.0; ax=&alpha; func=quad; *fa=(*func)(*ax); printf("*fa=%f\n",*fa); return 0; } test3.cの「*fa=(*func)(*ax);」は,「Numerical Recipes in C」に記載の関数mnbrakの定義内の記述に従ったのですが,何がいけないのでしょうか.よろしくお願いいたします.

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

  • ベストアンサー
  • Electman
  • ベストアンサー率19% (30/154)
回答No.1

「*fa=(*func)(*ax);」の処理時点でfaに対してデータエリアが割り当てられていないため。 fa=&value;が抜けているのが原因です。

takana049
質問者

お礼

早速のご回答ありがとうございました. 確かに,mainの中に, float value;と fa=&value; を追加すると,正常に走って,期待する答えを得ることができました. ポインタfaを使用すれば,もはやvalueという変数は持出す必要はないと思っていました. 大変勉強になりました.重ねてありがとうございました.

関連するQ&A

  • value=(*func)(*ax)

    参考にしたいある関数mnbrakの定義は,次のようになっています. void mnbrak(float *ax, float *bx, float *cx, float *fa, float *fb, float *fc, float (*func)(float)) { float ulim,u,r,q,fu,dum; *fa=(*func)(*ax); *fb=(*func)(*bx); if (*fb > *fa) { ・・・ } (中略) } ここで知りたいことは, この中の「*fa=(*func)(*ax);」という文を実行するために必要な呼び出し側のプログラム例です. そこで,次のようなプログラムを作成してみました. /* test.c */ #include <stdio.h> float quad(float alf) { float z; z=(10.0+alf*5.0)*(10.0+alf*5.0); return z; } int main() { float* ax; float value; float alpha; float (*func)(); alpha=1.0; ax=&alpha; func=quad; value=(*func)(*ax); printf("value=%f\n",value); return 0; } このプログラムtest.cを実行すると,期待する答えの225すなわち(10.0+5.0)*(10.0+5.0)にならずに,100すなわち10.0*10.0となってしまいました. デバッグモードで,上記の文「value=(*func)(*ax);」を実行するすると,ちゃんとquadへ飛んで行くのですが,引数「1.0」をquadに渡すことができずに,quad側では,alf=0.0となっていました. 私は,「ax」は変数「alpha」へのポインタなので,alphaのアドレスを保持しており,したがって「*ax」は,そのアドレスの内容,すなわち「1.0」であり,「(*func)(*ax)」によって,この「1.0」が実引数としてquadの仮引数「alph」に渡ると思ったのですが(実際quadへ飛んでいく直前では,*axは1.0になっていましたが),そうは行かなかったようなのです. 長い質問文で失礼しますが,よろしくお願いいたします.

  • funcの値

    こんにちは! 以下のプログラムですがいまひとつ流れが 分からずにいます、5を入力すると120が出力 されるのですが、(5-1)*5なので20ではないのでしょうか?? どなたか宜しければ教えてくださいm(_ _)m #include <stdio.h> double func(double n){ if ( n > 0 ) { return func ( n - 1 ) * n; } else { return 1; } } int main(){ int n; scanf("%d",&n); printf("%.0f\n",func(n)); return 0; }

  • 関数プロトタイプ無しで、引数が float の場合

    またまた float がらみでつまずています。 以下のようなソース(2つのファイルに分割されています)を実行すると、 f = 2.000000 と表示されました。 test1.c で、func() のプロトタイプを書いてないのが諸悪の根源だとは思うのですが(警告もでています)プロトタイプの役割は、 ・引数の型の不整合がないようにする ・必要に応じて、仮引数と実引数の型変換を発生させる だと思います。 このソースでは(たまたまですが)引数の型もあっているので、正常に実行できそうな気がするのですが、なぜ、結果がおかしくなってしまうのでしょうか。 確かに、プロトタイプがないのは好ましくはないですが。 test1.c に、int func(float f); を追加したときには、確かに f = 0.010000 と表示されます。 また、f と func() の引数を double にしたときには、プロトタイプがなくても、正常に実行されます。 ----- test1.c ------------- int main() { float f = 0.01; func(f); return 0; } ----- test2.c ------------- #include <stdio.h> int func(float f) { printf("f = %f", f); return 0; } ----- ここまで ------------

  • C言語におけるtxtファイルの読み込みと出力

    環境:WinXP,Borland C++compiler 以下のようなプログラムを考えました。 ・sample.c #include <stdio.h> float func(float x,float y,float z); int main(void) { float x,y,z; scanf("%f",&x); scanf("%f",&y); scanf("%f",&z); printf("%f",func(x,y,z)); return 0; } float func(float x,float y,float z) { return x+y+z; }//ここまで。 例えば(x,y,z)=(1,2,3)と入力すると6が出力されます。 このプログラムを、任意のn組の(x,y,z)の記述されたテキストファイルを読み込んで出力outを計算し、別のテキストファイルにn組の(x,y,z,out)を書き込むようにするにはどのような変更を加えればよいのでしょうか。 具体例は以下のような感じです。用意しておいたinput.txtをsample.cで読み込んで計算し、また作成されていないoutput.txtに出力するのが目標です。 (n=3の場合) ・input.txt //x y z 1 2 3 1 8 9 -1 7 5 ・output.txt //x y z out 1 2 3 6 1 8 9 18 -1 7 5 11

  • C言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。

  • 関数の出力引数をクラスにするには?

    既出、または基礎の質問でしたらすみません。 ここでも他の検索エンジンでも見つけられなかったので。。。 C++です。 クラスを出力する関数を作りたいのですが、うまくできません。 ソースは以下のとおりです。問題は、プログラム下方のf1(),f2(),main()です。 長くて、そして見づらくてすみません・・・ //////////// #include<stdio.h> class test{ private: int num; float *vec; public: test(int n=1); //ctor ~test(); //dtor int getnum(){return num;} float* getvec(); void set(int,float*); void show(); }; test::test(int n){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = (float)i; } test::~test() {delete[] vec;} float* test::getvec(){ float *v; v = new float[num]; for(int i=0; i<num; i++) v[i] = vec[i]; return v; } void test::set(int n, float *v){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = v[i]; } void test::show(){ for(int i=0; i<num; i++) printf("%d: %g\n",i,vec[i]); } void f1(test &x, test &y){ int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); } test f2(test x){ test y; //* int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); return y; //** } void main(){ test x,y; int n = 4; float v[4] = {1.0,2.0,3.0,4.0}; printf("x:\n"); x.set(n,v); x.show(); printf("f1:\n"); f1(x,y); y.show(); printf("f2:\n"); y=f2(x); y.show(); } //////////// これを実行すると x: 0: 1 1: 2 2: 3 3: 4 f1: 0: 2 1: 4 2: 6 f2: 0: 7.38979e-38 1: 7.38979e-38 2: 6 となります。 関数f2がうまく動かない理由がわかりません。。。 出力引数にクラスはとれないのでしょうか?? よろしくお願いします。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • ax^2+bx+c=0の解を求めたいのですが・・(初歩的です)

    タイトル通り、a、b、cを入力させて、ax^2+bx+c=0の解xを求めたいのですが、結果をどう求めればいいのか、実解・虚数解・重解の場合をどうしたらいいのか、の2点がよくわかりません。 #include<math.h> #include<stdio.h> double sqrt(double a,double b,double c) { return (b*b-4*a*c); } main(void) { double a,b,c,sqrt,ans; do{ printf("ax^2 + bx +c = 0 の解 x を求めます。\n a,b,cを入力してください。\n"); printf("a : "); scanf("%lf",&a); printf("\nb : "); scanf("%lf",&b); printf("\nc : "); scanf("%lf",&c); if(a = 0){ printf("a は0以外を入力してください。\n"); } }while(a = 0); ans = (-b+dist(a,b,c))/(2*a); printf("%lf", ans); printf("\n"); return(0); } 他にも多々ダメな部分があると思いますがご指摘・アドバイス等いただけたらと思います。よろしくお願いします。

  • c言語の実行結果どうか教えてくださいませ

    double fA(double a) { printf("kansu fA\n'); returna/2.0 } double fB(double b) { double a; printf("kansu fB\n"); a=fA(b); printf("fA(b)=%f\n",a); return a; } int main(void) { fB(210.0); return 0; } 特に小数の表示でございます… 他のサイトでも聞いたのですモヤモヤしまして 何卒宜しくお願いします。

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

専門家に質問してみよう