In C, how would I choose whether to return a struct or a pointer to a struct?

c, malloc, pointers, struct

Solution

When `something_t` is small (read: copying it is about as cheap as copying a pointer) and you want it to be stack-allocated by default:

something_t make_something(void);

something_t stack_thing = make_something();

something_t *heap_thing = malloc(sizeof *heap_thing);
*heap_thing = make_something();

When `something_t` is large or you want it to be heap-allocated:

something_t *make_something(void);

something_t *heap_thing = make_something();

Regardless of the size of `something_t`, and if you don’t care where it’s allocated:

void make_something(something_t *);

something_t stack_thing;
make_something(&stack_thing);

something_t *heap_thing = malloc(sizeof *heap_thing);
make_something(heap_thing);

Problem

Working on my C muscle lately and looking through the many libraries I've been working with its certainly gave me a good idea of what is good practice. One thing that I have NOT seen is a function that returns a struct: ``` something_t make_something() { ... } ``` From what I've absorbed this is the "right" way of doing this: ``` something_t *make_something() { ... } void destroy_something(something_t *object) { ... } ``` The architecture in code snippet 2 is FAR more popular than snippet 1. So now I ask, why would I ever return a struct directly, as in snippet 1? What differences should I take into account when I'm choosing between the two options? Furthermore, how does this option compare? ``` void make_something(something_t *object) ```

Original source

Related problems