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

标签 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;

最佳答案

举个基本的例子,像这样分配Lesson对象的teachers数组:

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;
}

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

关于c - 如何分配和重新分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16596104/

相关文章:

c - ezxml xml解析api

将 8 位指针转换为 long

c - 人类可读的 64 位 time_t 值字符串

c - Unsigned/Signed Arthmetic Problems from A Programmer's Perspective 教科书

c - fio 写操作错误检查

c - 如何打印从 pcap 文件读取的数据包的时间戳?

c - ARM 汇编器中的可变大小 int 矩阵

c - 在 C 中为 pic18f1xk22 设置 ADC

将 char 数组的值复制到二维数组

c - 指向 C 中指针的指针