単連結リストの整列 #103 成績記録の実装の誤り
二教科の成績記録の#100での実装に間違いがあった。
school_record_t
型の実体を生成する関数school_record_new
において、
生徒の名前p->name
のための領域の割り当てに失敗したときに、
既に割り当てていたschool_record_t
型の領域を解放しているものの、
解放済みのその領域を指すポインタをそのまま関数の戻り値として返していた。
修正はシンプルに、
school_record.c
...snip school_record_t *school_record_new(const char *name, const grade_t *maths, const grade_t *physics) { school_record_t *p = NULL; if (name != NULL) { p = malloc(sizeof(school_record_t)); if (p != NULL) { p->name = malloc(strlen(name) + 1); if (p->name != NULL) { strcpy(p->name, name); p->maths = maths; p->physics = physics; } else { free(p); p = NULL; } } } return p; } ...snip