我在这里已经看过这个话题几次了,但找不到能帮我解决问题的信息。我正在尝试通过为我的编程类释放内存来变得更好。我有下面的代码来分配一些内存,但是我不太明白如何释放它。我获取成员的数量,分配那么多的成员,然后分配每个成员所评价的葡萄酒的数量,并将他们所评价的每种葡萄酒的信息存储在通过我的成员所链接的另一个结构中。
如何为这种特定风格的程序释放内存?
我注释掉了用于显示输入到程序中的信息的printf语句。感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
typedef struct wine {
char type[20];
char brand[20];
int rating;
} wine;
typedef struct member {
char name[20];
int numRated;
wine* list;
} member;
int main()
{
int n;
scanf("%d", &n);
member *members = malloc(n * sizeof(member));
for(int i=0; i<n; i++){
scanf("%s", (members+i)->name);
scanf("%d", &(members+i)->numRated);
(members+i)->list = malloc((members+i)->numRated * sizeof(wine));
for(int j=0; j<(members+i)->numRated; j++){
scanf("%s", (members+i)->list[j].type);
scanf("%s", (members+i)->list[j].brand);
scanf("%d", &(members+i)->list[j].rating);
}
}
// for(int i=0; i<n; i++){
// printf("%s: %d\n", (members+i)->name, (members+i)->numRated);
// for(int j=0; j<(members+i)->numRated; j++){
// printf("Type:%s Brand: %s Rating: %d\n", (members+i)->list[j].type, (members+i)->list[j].brand, (members+i)->list[j].rating);
// }
// printf("\n");
// }
return 0;
}编辑:提出一个明确的问题。
发布于 2021-02-16 10:55:06
解决方案:
在代码的底部,首先释放每个成员的葡萄酒评级,然后释放成员列表本身:
for (int i = 0; i < n; i++) {
free(members[i].list); // Or free((members + i)->list;
}
free(members);通常,对于每个对malloc的调用,都应该有一个匹配的对free的调用。
更多的解释:
第一次调用malloc会分配一个内存块来保存n成员的信息。尽管这块内存可以存储n成员的信息,但它仍然只是一个内存块,只需调用一次释放即可释放。
在您的循环中,为每个成员(n时间)分配一个内存块,用于存储他们的葡萄酒评级信息。即使一个成员有多个葡萄酒评级,该成员的葡萄酒评级仍然只有一块内存,所以您需要调用free的次数与拥有葡萄酒评级的成员的数量一样多。
另外,请注意对free的调用是如何以与对malloc的调用相反的顺序发生的。直观地说,这是有道理的,在释放members之前,您应该先释放members[i].list。
https://stackoverflow.com/questions/66216191
复制相似问题