を変更しstruct
て、割り当てられた構造に存在するコースの数を追加する必要があります。
typedef struct School {
char *name;
int ncourses;
char *courses[]; //Flexible Array Member
} School;
2 つの学校があり、1 つには 3 つのコースがあり、もう 1 つには 2 つのコースがあるとします。構造を次のように割り当てます。
School *mc = malloc(offsetof(struct School, courses) + 3 * sizeof(char *));
mc->name = strdup("Math College");
mc->ncourses = 3;
mc->courses[0] = strdup("Math 101");
mc->courses[1] = strdup("Math 102");
mc->courses[2] = strdup("Math 103");
School *ps = malloc(offsetof(struct School, courses) + 2 * sizeof(char *));
ps->name = strdup("Psycho School");
ps->ncourses = 2;
ps->courses[0] = strdup("Psycho 101");
ps->courses[1] = strdup("Unknown 404");
ご覧のとおり、変数配列の要素は、他の配列要素と同じようにアクセスされます。この呼び出しは、構造体の末尾にある構造malloc
体メンバーと配列要素 (ここではポインター) に適切なサイズをバイト単位で割り当てます。char *
ジェネリック関数を使用して、そのような構造を割り当てて初期化できます。
School create_school(const char *school_name, int ncourses, char *courses[]) {
School *sp = malloc(offsetof(struct School, courses) + ncourses * sizeof(char *));
sp->name = strdup(school_name);
sp->ncourses = ncourses;
for (int i = 0; i < ncourses; i++) {
sp->courses[i] = strdup(courses[i]);
}
return sp;
}