由malloc和自由行为混淆

我对使用free()关于C中的数据结构感到困惑.

如果我有以下数据结构:

struct Person {
    char *name;
    int age;
    float weight;
    float height;
};

我通过malloc()为结构分配内存,同样:struct Person * me = malloc(sizeof(struct Person));

在完成使用我的结构之后(在结束程序之前),我继续释放分配的内存,如下所示:

free(person_pointer->name);
free(person_pointer);

根据我的知识,释放名称指针所指向的内存是必要的,因为如果我只释放person_pointer,我只释放分配用于存储数据结构及其成员的内存,而不释放指针所指向的内存 – 成员结构.

但是我的实现valgrind似乎暗示第一个free()无效.

所以我的问题归结为:当我通过指针释放结构所占用的内存时,我是否应该抢先释放成员指针所指向的内存?

编辑:这是我的整个代码:

#include <stdio.h>
#include <stdlib.h>

struct Person {
    char *name;
    int age;
    float weight;
    float height;
};

int main(int argc, char **argv)
{
    struct Person *me = malloc(sizeof(struct Person));
    me->name = "Fotis";
    me->age = 20;
    me->height = 1.75;
    me->weight = 75;

    printf("My name is %s and I am %d years old.\n", me->name, me->age);
    printf("I am %f meters tall and I weight %f kgs\n", me->height, me->weight);

    free(me->name);
    free(me);

    return 0;
}
最佳答案
me->name = "Fotis";

/* ... */

free(me->name);

规则是:

1 malloc = 1 free

你没有在me-> name上使用malloc,所以你不必释放它.

BTW,me-> name应该是const char *类型.

转载注明原文:由malloc和自由行为混淆 - 代码日志