• 締切済み

mallocで動的確保後、値が変わる

最近よく出くわすバグなのですが、mallocでメモリを動的確保して、いくつかの処理をした後に値が変わっていたり、読めなくてセグメンテーションエラーになることがあります。 根本的に何か間違っているのかもしれませんが、なかなかわかりません。 例えばこんな感じです ... int main(int argv,char *argc[]) { double *arrXn; double *arrFn; double *arrX; double *arrY; double *arrV; double *arrD; double **arrCn; ... //N(0~9)を受け取る arrXn=(double *)malloc(sizeof(double)*(N+1)); arrFn=(double *)malloc(sizeof(double)*(N+1)); arrX=(double *)malloc(sizeof(double)*(N+1)); arrY=(double *)malloc(sizeof(double)*(N+1)); arrV=(double *)malloc(sizeof(double)*(N+1)); arrD=(double *)malloc(sizeof(double)*(N+1)); arrCn=(double **)malloc(sizeof(double *)*(N+2)); for(incA=0;incA<=N;incA++){ arrCn[incA]=(double *)malloc(sizeof(double)*4); } for(incA=1;incA<N;incA++){ arrCn[incA][0]=arrFn[incA-1]; arrCn[incA][1]=arrV[incA-1]; arrCn[incA][2]=-3*arrFn[incA-1]+3*arrFn[incA]-2*arrV[incA-1]-arrV[incA]; arrCn[incA][3]=2+arrFn[incA-1]-2*arrFn[incA]+arrV[incA-1]+arrV[incA]; } printf("%lf",arrCn[1][1]);getchar(); //取れる for(incA=0;incA<=numHokan;incA++){ arrX[incA]=Setx(incA); //自作関数 } printf("%lf",arrCn[1][1]);getchar(); //セグメンテーションエラー 特に多次元配列を作成したり、動的確保を大目にすると起こりやすいです。 もし何かお気付きのことがありましたらよろしくお願いします。

みんなの回答

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.5

arrXのmallocサイズが最大10個なのに、 const int numHokan=40; … arrX=(double *)malloc(sizeof(double)*(N+1)); … for(incA=0;incA<=numHokan;incA++){ arrX[incA]=Setx(incA); } これではおもいっきりオーバーフローしています。 他にもいくつか突っ込みどころはありますが、ちゃんと動いていますか?

sirooni
質問者

補足

すいません。実はまだバグ取り(コンパイルエラー以外)段階なので色々ミスってるかもしれません。動的確保の部分以外をキチンとしてからの方がはっきりしますね。 出直してきます

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

for(incA=0;incA<=numHokan;incA++){ arrX[incA]=Setx(incA); } ですが、numHokan=40の為、 arrX[40]=Setx(40);の状態が発生します。 ところが、 arrX=(double *)malloc(sizeof(double)*(N+1)); であり、N=2の場合、3個しか確保していません。 ここで、メモリを壊していませんか。

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.3

N==0の場合、 arrCn=(double **)malloc(sizeof(double *)*(N+2)); これは2個の配列のアドレスを格納するための領域確保になりますね。 arrCnに値を格納するための領域をmallocしているfor文 for(incA=0;incA<=N;incA++){ これだとarrCn[0]に4個の領域が確保されるだけです。 値を格納しているfor文 for(incA=1;incA<N;incA++){ これは1回も実行されることなくループを抜けます。 最初のprintf関数 printf("%lf",arrCn[1][1]);getchar(); //取れる ここで領域外を参照していますが、想定どおりの値が取れているのでしょうか?。 ふたつのfor文のループ条件部分は"incA<N+2"でなければならないのでは?

sirooni
質問者

補足

すいません。N(2~9)の間違いです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

とりあえず、動作するプログラムを貼ってもらわないと、原因の特定は無理です。

sirooni
質問者

補足

ありがとうございます。 http://sirooni.moe.to/spu.c ここに用意しました。

回答No.1

一番多いケースがメモリリークでしょうね。 配列を使う場合に特にミスし易いです。

関連するQ&A