マンガでよめる痔のこと・薬のこと

以下のプログラムは、下記の入力データを構造体に格納し、平均身長と平均体重を求めて画面に出力するプログラムです。feeによるメモリの開放が動いていないようで、結果まで出力してくれるのですが、その直後エラー終了してしまいます。なにが悪いのか全く分かりません!!どなたかアドバイスをお願いしますm(__)m
データファイル
Sakuragi
189
83
みたいなデータが5組あります。

ソースプログラム
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct person{
char name[20];
int height;
int weight;
struct person *next;
}LIST;

LIST *ave(LIST *head);
LIST *newLIST(void);

int main(int argc,char *argv[]){
char namae[20];
int n=0,shinchou,taijuu;
FILE *fp;
LIST *head;
LIST *p;
LIST *np;
LIST *npb;
LIST *AVE;
head = newLIST();
npb = head;

if((fp=fopen(argv[1],"r"))==NULL){
printf("no file\n");
exit(1);
}

while(n != 5){
np = newLIST();
fscanf(fp,"%s %d %d",namae,&shinchou,&taijuu);
strcpy(p->name,namae);
np->height= shinchou;
np->weight= taijuu;
npb->next=np;
npb=np;
n++;
}
fclose(fp);
AVE = ave(head);
printf("%d\t%d\n",AVE->height,AVE->weight);

for(p=head;p != NULL;p= p->next){
free(p);
}
return(0);
}

LIST *newLIST(){
LIST *p;
p=(LIST*)malloc(sizeof(LIST));
p->next = NULL;
return(p);
}

LIST *ave(LIST *head){
LIST *p,*pp;
int h=0,w=0;
for(p=head->next;p != NULL;p=p->next){
h += p->height;
w += p->weight;
}
h = h/5;
w = w/5;
pp->height = h;
pp->weight = w;
return(pp);
}

A 回答 (3件)

for(p=head;p != NULL;p= p->next){


free(p);
}

ここを良く見ると開放してから参照してる。
なるべく簡単に直すなら、次へのポインタをとっておいてから開放すればよい。

LIST *np;
for(p=head;p != NULL;p= np){
np = p->next
free(p);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/20 02:35

これが原因かどうかは分かりませんが、



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

のようにしてみては如何でしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/20 02:29

質問とは関係ないけど


>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);
}
とかすればいいのでは
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/20 02:32

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


人気Q&Aランキング