- 締切済み
メモリの解放free
double **w; int no; | if((w = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error1"); exit(1); } | データ格納処理 | free(w); のようなプログラムの中で、 データ格納処理の途中でSegmentation faultで 落ちてしまいました。この場合、freeが実行されなくても メモリは解放してくれるのでしょうか? また、mallocでメモリ確保できたはずなのに 存在するはずの場所にデータを格納できない原因として 考えられるものはなんでしょうか? ちなみに、落ちる場所が実行の度に変わっているようで、 同じ条件なのにデータの格納数が違っています。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- MovingWalk
- ベストアンサー率43% (2233/5098)
#2です。私ならこうするかな? #define NN 1000 int main(int argc, char ** argv) { double *w; int i,j; if((w = (double *)malloc(sizeof(double)*NN*NN))== NULL) exit(1); w[i*NN + j] = 0 ; free(w); }
- madman
- ベストアンサー率24% (612/2465)
2次元配列をmallocですか... 普通、構造体使いませんか? typedef struct { double *w; } TW; TW *w; if((w = (TW *)malloc(sizeof(TW)*no))==NULL){ printf("Memory Error1"); exit(1); } for (i=0; <no; i++){ if((w[i].w = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } } 利用するときは for (i=0; i<no; i++) { for (j=0; j<no; j++) { w[i].w[j] =・・・; } }
お礼
色々と教えていただき、ありがとうございます。 参考にさせてもらいます。
- nagare
- ベストアンサー率33% (280/831)
この場合は2次元配列とはいいせんが・・・ ヒント double **w; double *w1; int no; int no2; if((w1 = (double *)malloc(sizeof(double *)*no))==NULL){ printf("Memory Error1"); exit(1); } w=&w1; for(no2=0; no2<no; no2++){ if((w1[no2] = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } w=1; }
お礼
ありがとうございます。参考にさせてもらいます。
- MovingWalk
- ベストアンサー率43% (2233/5098)
w[no]の配列領域を確保するんですから、 double *w; でなければいけませんね。 w = (double *)malloc(sizeof(double)*no) の部分も左右の型が違っていますね。 これではうまく動きません。 malloc()した領域はOSがヒープから割り当てますが、プロセスが終了すれば 普通はOSが開放します。 (プログラムできちんと処理する様にするのがベターですが)
補足
すみません、省略しすぎました。 実際は2次元配列で double **w; int no; int no2; if((w = (double **)malloc(sizeof(double *)*no))==NULL){ printf("Memory Error1"); exit(1); } for(no2=0; no2<no; no2++){ if((w[no2] = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } } とやっています。 メモリは自動解放してくれるのですね。 教えていただき、ありがとうございます。
- madman
- ベストアンサー率24% (612/2465)
double **w; を double *w; に変えましょう。何故ダブルポインタにしてるのか不明ですが、これでは意図した動作はできないと思いますよ。 Segmentation Faultで落ちると、プログラムが落ちるのですよね? 大体はOSが開放してくれます。
補足
すみません、省略しすぎました。 実際は2次元配列で double **w; int no; int no2; if((w = (double **)malloc(sizeof(double *)*no))==NULL){ printf("Memory Error1"); exit(1); } for(no2=0; no2<no; no2++){ if((w[no2] = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } } とやっています。 メモリは自動解放してくれるのですね。 教えていただき、ありがとうございます。
お礼
色々と教えていただき、ありがとうございます。 参考にさせてもらいます。