Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically Allocating a Struct within a Struct

Tags:

c

malloc

struct

I am dynamically allocating a struct which has a different struct as a member:

struct a {
   // other members
   struct b;
}

struct b basically holds a pointer to another struct b, so think of struct b as a linked list.

If I dynamically allocate struct a, then that would also make a new struct b within it. However, what is the difference between doing that or having struct a hold a pointer to struct b, and dynamically allocate struct b within struct a? What is the difference in implementation?

like image 285
darksky Avatar asked Mar 25 '12 23:03

darksky


2 Answers

First, let's get some real definitions in place to make this concrete.

struct b {
    int x;
};

struct a_with_b {
    struct b b;
}

struct a_with_b_ptr {
    struct b *bp;
}

When you encapsulate a struct, you just need to allocate the outer struct (and since the inner struct is not a pointer, you use . to reference members of the innert struct):

struct a_with_b *a1 = malloc(sizeof(struct a_with_b));
a1->b.x = 3;

But when you encapsulate a pointer, you have to allocate each independently and use -> when referencing members of the inner struct:

struct a_with_b_ptr *a2 = malloc(sizeof(struct a_with_b_ptr));
a1->b = malloc(sizeof(struct b));
a1->b->x = 3;
like image 180
R Samuel Klatchko Avatar answered Sep 23 '22 14:09

R Samuel Klatchko


If you dynamically allocate (malloc) struct a as in

struct a *temp = (struct a *)malloc(sizeof(struct a));

you malloc space for a pointer to struct b (assuming that's what is in struct a) but you don't malloc space for struct b. That means later you'll have to do

temp->b = (struct b *)malloc(sizeof(struct b));

before you try and use struct b.

If you don't store a pointer to struct b but rather struct b directly then you'll get the automatic allocation when you define struct a.

like image 32
twain249 Avatar answered Sep 23 '22 14:09

twain249