使用指向另一个结构的结构释放内存
Freeing memory with a struct pointing to another struct
我在这里看到过几次这个主题,但找不到能帮助我解决问题的信息。我试图通过为我的编程释放内存来变得更好 class。我有下面的代码来分配一些内存,但不太明白如何释放它。我获取成员数量,分配那么多成员,然后分配每个成员评分的葡萄酒数量,并将他们评分的每种葡萄酒的信息存储在另一个通过我的成员链接的结构中。
如何为这种特定风格的程序释放内存?
我注释掉了用于显示输入到程序中的信息的 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;
}
编辑:提出明确的问题。
解决方案:
在代码的底部,您将首先释放每个成员的葡萄酒评级,然后释放成员列表本身:
for (int i = 0; i < n; i++) {
free(members[i].list); // Or free((members + i)->list;
}
free(members);
一般来说,对于 malloc
.
的每次调用,您都应该有一个对 free
的匹配调用
多一点解释:
第一次调用 malloc
分配一个内存块来保存 n
成员的信息。尽管这块内存可以存储 n
个成员的信息,但它仍然只是一个内存块,将通过一次 free 调用被释放。
在您的循环中,您为每个成员(n
次)分配了一个内存块,用于存储他们的葡萄酒评级信息。即使一个成员有很多葡萄酒评级,该成员的葡萄酒评级仍然只有一个内存块,因此您需要调用 free
与有葡萄酒评级的成员一样多。
另外,请注意对 free
的调用是如何以与对 malloc
的调用相反的顺序发生的。这在直觉上是有道理的,你会想在释放 members
.
之前释放 members[i].list
我在这里看到过几次这个主题,但找不到能帮助我解决问题的信息。我试图通过为我的编程释放内存来变得更好 class。我有下面的代码来分配一些内存,但不太明白如何释放它。我获取成员数量,分配那么多成员,然后分配每个成员评分的葡萄酒数量,并将他们评分的每种葡萄酒的信息存储在另一个通过我的成员链接的结构中。
如何为这种特定风格的程序释放内存?
我注释掉了用于显示输入到程序中的信息的 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;
}
编辑:提出明确的问题。
解决方案:
在代码的底部,您将首先释放每个成员的葡萄酒评级,然后释放成员列表本身:
for (int i = 0; i < n; i++) {
free(members[i].list); // Or free((members + i)->list;
}
free(members);
一般来说,对于 malloc
.
free
的匹配调用
多一点解释:
第一次调用 malloc
分配一个内存块来保存 n
成员的信息。尽管这块内存可以存储 n
个成员的信息,但它仍然只是一个内存块,将通过一次 free 调用被释放。
在您的循环中,您为每个成员(n
次)分配了一个内存块,用于存储他们的葡萄酒评级信息。即使一个成员有很多葡萄酒评级,该成员的葡萄酒评级仍然只有一个内存块,因此您需要调用 free
与有葡萄酒评级的成员一样多。
另外,请注意对 free
的调用是如何以与对 malloc
的调用相反的顺序发生的。这在直觉上是有道理的,你会想在释放 members
.
members[i].list