プロが教える店舗&オフィスのセキュリティ対策術

double**w;
int no;
   |
if((w = (double *)malloc(sizeof(double)*no))==NULL){
printf("Memory Error1");
exit(1);
}
   |
 データ格納処理
   |
free(w);

のようなプログラムの中で、
データ格納処理の途中でSegmentation faultで
落ちてしまいました。この場合、freeが実行されなくても
メモリは解放してくれるのでしょうか?
また、mallocでメモリ確保できたはずなのに
存在するはずの場所にデータを格納できない原因として
考えられるものはなんでしょうか?
ちなみに、落ちる場所が実行の度に変わっているようで、
同じ条件なのにデータの格納数が違っています。

A 回答 (5件)

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

とやっています。
メモリは自動解放してくれるのですね。
教えていただき、ありがとうございます。

補足日時:2003/02/28 13:08
    • good
    • 0

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

とやっています。
メモリは自動解放してくれるのですね。
教えていただき、ありがとうございます。

補足日時:2003/02/28 13:12
    • good
    • 0

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

}
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/02 00:01

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] =・・・;
 }
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/02 00:02

#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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/02 00:02

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