プログラムの謎のコアダンプが出ることによりいろいろ検査したところ、謎が解決できず質問させていただきます。
コード構成: pref.cの中はmainから受けっとった構造体のデータをポインタに代入することと それをポインタ使って表示する機能を持つ。
pref2mnain.c ではデータを保持している。また、自作構造体のポインタ変数を所持して、最後に(ここからコアダンプが出たところで)構造体ポインタ変数(p)のメモリ解放をする。(free)
Code構成 分割コンパイルして実行し、それぞれCodeを下に掲載 (pref.c pref2main.c pref.h )
また gcc のコマンドは $ gcc -c -Wall -O3 pref.c pref2main.c && gcc pref.o pref2main.o && ./a > out.txt && diff -Bw out.txt pexp.txt
です。(pexp.txt は以下となります)
Tokyo 2187.65 12988797
Osaka 1898.01 8840372
Hyogo 8395.89 5599359
解決したいこと:pref2mian.c(このソース内部だけを編集してそのCode)の中でメモリの解放を行ってかつコアダンプにならないようにしたい。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "pref.h" pref_t *pref_new(char *na, double ar, int pop){ pref_t *a=NULL; fprintf(stderr, "211 "); a= (pref_t *)malloc(sizeof(pref_t)* (strlen(na) + 1)); strcpy(a->name, na); a->area= ar; a->population= pop; return a; } void pref_print(pref_t* p){ printf("%s %0.2lf %d\r\n", p->name, p->area, p->population); fprintf(stderr, "223 "); }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "pref.h" #define NAMELEN 15 int main(void){ pref_t *g[3], p[3]= { {"Tokyo", 2187.65, 12988797}, {"Osaka", 1898.01, 8840372}, {"Hyogo", 8395.89, 5599359} }; fprintf(stderr, "asd \n0 "); for(int i=0; i< 3; i++) { g[i] = &p[i]; pref_new(g[i]->name, g[i]->area, g[i]->population); } fprintf(stderr, "\n1 "); for(int i=0; i< 3 ; i++) { pref_print(g[i]); // free(g[i]); } for(int i=0; i< 3 ; i++) { free(g[i]); g[i]=NULL; } fprintf(stderr, "\n2 "); return 0; }
#define NAMELEN 15 typedef struct { char name[NAMELEN+1]; /* 県名 */ double area; /* 面積 (km2)*/ int population; /* 人口 (人) */ } pref_t; pref_t *pref_new(char *name, double area, int population); void pref_print(pref_t* p);
もし解決できる方がいっらしゃれば、ここでの原理を説明したサイトリンクでもいいですので理由とともに教えていただければ大変感謝しております。
ありがとうございます。
回答4件
あなたの回答
tips
プレビュー