It's a good question and there is no correct answer, both options achieve the same result however from my experience option 1 is more common.
Differences:
Option 1 is more space efficient by a minimum of a size of a pointer on your environment. Note the mention of "minimum". If you had extra fields in your wrapper structure widget
that contained other useful information then not returning a pointer to a struct widget
in foo
will become extremely space inefficient.
Practical Uses:
Option 1 is used when you are only dealing with one structure. For example, implementing a structure to hold a point on the Euclidean plane or while implementing a dynamic array.
Option 2 is can be seen while implementing ADTs. You often need a wrapper structure to contain extra fields and hence implicitly using option 2.