如何分配和重新分配内存?

lam*_*poi 0 c

我必须为这些元素分配和重新分配内存.我试图解决它,但我的解决方案不起作用.有人可以帮忙吗?

typedef struct {
char Name[50];
char Surname[150];
}Teacher;


typedef struct{
  int id;
  char Title[256];
  int numberOfTeachers;
  Teacher* teachers;
}Lesson;


typedef struct{
  Lesson* arr;
  int numberOfLessons;
  }Lessons;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

对于一个基本示例,分配teachers一个Lesson对象的数组,如下所示:

Lesson lesson;
lesson.numberOfTeachers = 10;
lesson.teachers = malloc(lesson.numberOfTeachers * sizeof(*lesson.teachers));
Run Code Online (Sandbox Code Playgroud)

并解除分配:

free(lesson.teachers);
Run Code Online (Sandbox Code Playgroud)

但是你可能也需要Lesson动态分配对象.

Lessons lessons;
lessons.numberOfLessons = 5;
lessons.arr = malloc(lessons.numberOfLessons * sizeof(*lessons.arr));
Run Code Online (Sandbox Code Playgroud)

然后你将填充一个循环:

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;
}
Run Code Online (Sandbox Code Playgroud)

并解除分配:

for (size_t i=0; i<lessons.numberOfLessons; i++)
{
    free(lessons.arr[i]);
}
free(lessons.arr);
Run Code Online (Sandbox Code Playgroud)

你还想填充其余的字段,但我会专注于分配并留给你.

在实际代码中,您需要检查调用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;
}
Run Code Online (Sandbox Code Playgroud)

当您重新分配包含也分配了动态内存的元素的数组时,这会变得更加棘手.free在重新分配父数组之前,需要确保任何此类嵌套动态分配的内存.