首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用指向另一个结构的结构释放内存

使用指向另一个结构的结构释放内存
EN

Stack Overflow用户
提问于 2021-02-16 06:27:16
回答 1查看 55关注 0票数 1

我在这里已经看过这个话题几次了,但找不到能帮我解决问题的信息。我正在尝试通过为我的编程类释放内存来变得更好。我有下面的代码来分配一些内存,但是我不太明白如何释放它。我获取成员的数量,分配那么多的成员,然后分配每个成员所评价的葡萄酒的数量,并将他们所评价的每种葡萄酒的信息存储在通过我的成员所链接的另一个结构中。

如何为这种特定风格的程序释放内存?

我注释掉了用于显示输入到程序中的信息的printf语句。感谢您的帮助。

代码语言:javascript
运行
复制
#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;
}

编辑:提出一个明确的问题。

EN

Stack Overflow用户

回答已采纳

发布于 2021-02-16 10:55:06

解决方案:

在代码的底部,首先释放每个成员的葡萄酒评级,然后释放成员列表本身:

代码语言:javascript
运行
复制
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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66216191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档