dポイントプレゼントキャンペーン実施中!

最近よく出くわすバグなのですが、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(); //セグメンテーションエラー



特に多次元配列を作成したり、動的確保を大目にすると起こりやすいです。
もし何かお気付きのことがありましたらよろしくお願いします。

A 回答 (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);
}
これではおもいっきりオーバーフローしています。

他にもいくつか突っ込みどころはありますが、ちゃんと動いていますか?

この回答への補足

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

補足日時:2006/06/16 23:26
    • good
    • 0

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個しか確保していません。
ここで、メモリを壊していませんか。
    • good
    • 0

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"でなければならないのでは?

この回答への補足

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

補足日時:2006/06/16 22:52
    • good
    • 0

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

この回答への補足

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

補足日時:2006/06/16 22:31
    • good
    • 0

一番多いケースがメモリリークでしょうね。


配列を使う場合に特にミスし易いです。
    • good
    • 0

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