Returning a struct pointer

Should I declare a Mystruct variable,
define the properties of Mystruct,
assign a pointer to it, and return the
pointer

Definitely not, because the variable defined in the function (in “auto” storage class) will disappear as the function exits, and you’ll return a dangling pointer.

You could accept a pointer to a Mystruct (caller’s responsibility to allocate that) and fill it in; or, you can use malloc to create a new one (caller’s responsibility to free it when it’s done). The second option at least lets you keep the function signature you seem to be keen on:

Mystruct *mystruct(int num, int size)
{
   Mystruct *p = malloc(sizeof(MyStruct));
   ....
   return p;
}

but it’s often an inferior one — since the caller has to have responsibilities anyway, may as well go with the first option and potentially gain performance (if the caller can use an auto-class instance because it knows the scope of use is bounded).

You can’t use the variable because it will be deallocated when the function exits. For example:

Mystruct *mystruct(int num, int size)
{
   MyStruct x;
   x.num = 1;
   ...
   return &x;
}

Will give a segmentation fault or access violation because the memory for x is deallocated as soon as you exit. So you have to allocate memory for the struct (and be sure to free it up later) or declare a global that will stay around for ever. Example for the latter…

Mystruct *mystruct(int num, int size)
{
   MyStruct *x;
   x = (MyStruct*)malloc( sizeof( MyStruct ) );
   x->num = 1;
   ...
   return x;
}

Leave a Comment