• 締切済み

メモリの解放free

double **w; int no;    | if((w = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error1"); exit(1); }    |  データ格納処理    | free(w); のようなプログラムの中で、 データ格納処理の途中でSegmentation faultで 落ちてしまいました。この場合、freeが実行されなくても メモリは解放してくれるのでしょうか? また、mallocでメモリ確保できたはずなのに 存在するはずの場所にデータを格納できない原因として 考えられるものはなんでしょうか? ちなみに、落ちる場所が実行の度に変わっているようで、 同じ条件なのにデータの格納数が違っています。

みんなの回答

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.5

#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); }

arisa5
質問者

お礼

色々と教えていただき、ありがとうございます。 参考にさせてもらいます。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.4

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] =・・・;  } }

arisa5
質問者

お礼

色々と教えていただき、ありがとうございます。 参考にさせてもらいます。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.3

この場合は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; }

arisa5
質問者

お礼

ありがとうございます。参考にさせてもらいます。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

w[no]の配列領域を確保するんですから、 double *w; でなければいけませんね。 w = (double *)malloc(sizeof(double)*no) の部分も左右の型が違っていますね。 これではうまく動きません。 malloc()した領域はOSがヒープから割り当てますが、プロセスが終了すれば 普通はOSが開放します。 (プログラムできちんと処理する様にするのがベターですが)

arisa5
質問者

補足

すみません、省略しすぎました。 実際は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)
回答No.1

double **w; を double *w; に変えましょう。何故ダブルポインタにしてるのか不明ですが、これでは意図した動作はできないと思いますよ。 Segmentation Faultで落ちると、プログラムが落ちるのですよね? 大体はOSが開放してくれます。

arisa5
質問者

補足

すみません、省略しすぎました。 実際は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); } } とやっています。 メモリは自動解放してくれるのですね。 教えていただき、ありがとうございます。

関連するQ&A

専門家に質問してみよう