對於一個基本的例子,分配teachers
陣列Lesson
對象是這樣的:
Lesson lesson;
lesson.numberOfTeachers = 10;
lesson.teachers = malloc(lesson.numberOfTeachers * sizeof(*lesson.teachers));
而取消分配:
free(lesson.teachers);
但你可能會需要分配的Lesson
對象也是動態的。
Lessons lessons;
lessons.numberOfLessons = 5;
lessons.arr = malloc(lessons.numberOfLessons * sizeof(*lessons.arr));
然後你就會在一個循環填充:
for (size_t i=0; i<lessons.numberOfLessons; i++)
{
Lesson *lesson = malloc(sizeof(*lesson));
lesson->numberOfTeachers = 10;
lesson->teachers = malloc(lesson.numberOfTeachers * sizeof(*lesson.teachers));
lessons.arr[i] = lesson;
}
而取消分配:
for (size_t i=0; i<lessons.numberOfLessons; i++)
{
free(lessons.arr[i]);
}
free(lessons.arr);
您還需要填充字段的休息,但我將專注於分配並將其留給你。
在實際代碼中,您需要檢查您的調用返回值爲malloc
是否有錯誤,並做出相應的響應。
重新分配有點棘手。假設您想要更改Lesson
對象中的teachers
陣列的長度。在這一點上,我認爲你需要開始包裝功能。
void SetTeacherCount(Lesson *lesson, int count)
{
Teacher* newTeachers = realloc(lesson->teachers, count*sizeof(*lesson->teachers));
if (newTeachers == NULL)
{
// handle error
}
lesson->teachers = newTeachers;
}
當您重新分配包含也分配了動態內存的元素的數組時,這會變得更加棘手。在重新分配父數組之前,您需要確保您的free
任何此類嵌套動態分配的內存。
練習free()非常適合將來參考。如果你是C新手,掌握免費的東西很重要。如果你在更大的程序中沒有釋放內存,你將會發生內存泄漏。 –