对于一个基本的例子,像这样分配一个对象的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
存在错误,并做出相应的响应。
重新分配有点棘手。假设您要更改对象中teachers
数组的长度。Lesson
在这一点上,我认为您需要开始将内容包装在函数中。
void SetTeacherCount(Lesson *lesson, int count)
{
Teacher* newTeachers = realloc(lesson->teachers, count*sizeof(*lesson->teachers));
if (newTeachers == NULL)
{
// handle error
}
lesson->teachers = newTeachers;
}
当您重新分配包含也分配了动态内存的元素的数组时,这会变得更加棘手。在重新分配父数组之前,您需要确保free
任何此类嵌套的动态分配内存。