• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:freeでメモリが開放できません。。。)

freeでメモリが開放できません

このQ&Aのポイント
  • 以下のプログラムは、構造体に格納された入力データから平均身長と平均体重を求めて出力するプログラムです。
  • しかし、freeによるメモリの開放が正しく行われていないため、エラーが発生してプログラムが終了してしまいます。
  • どなたかアドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

for(p=head;p != NULL;p= p->next){ free(p); } ここを良く見ると開放してから参照してる。 なるべく簡単に直すなら、次へのポインタをとっておいてから開放すればよい。 LIST *np; for(p=head;p != NULL;p= np){ np = p->next free(p); }

you-two
質問者

お礼

質問からわずか20分ほどでアドバイスいただき感謝します!! このエラーのせいで2時間ほど苦しんでおりました。。。 今後同じ間違いをしないよう気をつけます~

その他の回答 (2)

回答No.3

これが原因かどうかは分かりませんが、 for(p=head;p != NULL;p= p->next){ free(p); } はまずいですね。free(p) で p が指すメモリブロックを開放した後で、p->next を演算することになっているからです。 for(p=head ; p != NULL ; p = np) { np = p->next; free(p); } のようにしてみては如何でしょう。

you-two
質問者

お礼

ありがとうございます!! マジで助かりました!!なるほど~参照する前にfreeしちゃ まずいですよね!!やっと寝れます~

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

質問とは関係ないけど >strcpy(p->name,namae); は、 strcpy(np->name,namae); >for(p=head;p != NULL;p= p->next){ >free(p); >} free(p)した後でp->nextを使うのはダメだと思う。 例えば、 for(p=head;p != NULL;p= np){ np=p->next; free(p); } とかすればいいのでは

you-two
質問者

お礼

ありがたきアドバイスに感謝します!! アドバイス通りに訂正したらエラー出ませんでした! 今度からfreeする前に参照するように気をつけます!!

関連するQ&A