I would go for (1) with one simple extension, that is to have your _init function always return the pointer to the object. Your pointer initialization then may just read:
myStruct *s = myStruct_init(malloc(sizeof(myStruct)));
As you can see the right hand side then only has a reference to the type and not to the variable anymore. A simple macro then gives you (2) at least partially
#define NEW(T) (T ## _init(malloc(sizeof(T))))
and your pointer initialization reads
myStruct *s = NEW(myStruct);