2013-05-16 41 views
0

我必須爲這些元素分配和重新分配內存。我試圖解決它,但我的解決方案沒有奏效。誰能幫忙?如何分配和重新分配內存?

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; 

回答

6

對於一個基本的例子,分配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任何此類嵌套動態分配的內存。

+1

練習free()非常適合將來參考。如果你是C新手,掌握免費的東西很重要。如果你在更大的程序中沒有釋放內存,你將會發生內存泄漏。 –