Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Confused by malloc and free behaviour

Tags:

c

malloc

free

I am confused with the usage of free() in regard to data structures in C.

If I have the following data structure:

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

I am allocating memory for the structure via malloc(), likewise: struct Person *me = malloc(sizeof(struct Person));

After I am done with using my structure (right before ending the program), I proceed to freeing the memory allocated, like this:

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

Freeing the memory that the name pointer points to is necessary to my knowledge, because if I only free person_pointer I only free the memory that was allocated to store the data structure and its members but not the memory that is pointed to by pointers-members of the structure.

However with my implementation valgrind seems to suggest that the first free() is invalid.

So my question boils down to: When I free the memory that a struct occupies via a pointer, should I preemptively free the memory that member pointers point to or not?

EDIT: This is my whole code:

#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;
}
like image 776
NlightNFotis Avatar asked Mar 03 '13 12:03

NlightNFotis


People also ask

When should I use free and malloc?

The malloc function will request a block of memory from the heap. If the request is granted, the operating system will reserve the requested amount of memory. When the amount of memory is not needed anymore, you must return it to the operating system by calling the function free.

Can you malloc after free?

Occasionally, free can actually return memory to the operating system and make the process smaller. Usually, all it can do is allow a later call to malloc to reuse the space. In the meantime, the space remains in your program as part of a free-list used internally by malloc .

Does every malloc need a free?

But the memory allocation using malloc() is not de-allocated on its own. So, “free()” method is used to de-allocate the memory. But the free() method is not compulsory to use.

How does malloc find free space?

In C, the library function malloc is used to allocate a block of memory on the heap. The program accesses this block of memory via a pointer that malloc returns. When the memory is no longer needed, the pointer is passed to free which deallocates the memory so that it can be used for other purposes.


1 Answers

me->name = "Fotis";

/* ... */

free(me->name);

The rule is:

1 malloc = 1 free

You didn't use malloc on me->name, so you don't have to free it.

BTW, me->name should be of const char * type.

like image 112
md5 Avatar answered Sep 22 '22 16:09

md5