That could give some element of reflexion:
case #1 mimick the memory allocation scheme of C++, with more or less the same benefits :
- easy allocation of temporaries on stack (or in static arrays or such to write you own struct allocator replacing malloc).
- easy free of memory if anything goes wrong in init
case #2 hides more informations on used structure and can also be used for opaque structures, typically when structure as seen by user is not exactly the same as internally used by the lib (say there could be some more fields hidden at the end of structure).
Mixed API between case#1 and case #2 is also common : there is a field used to pass in a pointer to some already initialized structure, if it is null it is allocated (and pointer is always returned). With such API the free is usually responsibility of caller even if init performed allocation.
In most cases I would probably go for case #1.