Both ways are ok, I tend to do the first way as a lot of the C I do is for embedded systems and all the memory is either tiny variables on the stack or statically allocated. This way there can be no running out of memory, either you have enough at the beginning or you're screwed from the start. Good to know when you have 2K of Ram :-) So all my libraries are like #1 where the memory is assumed to be allocated.
But this is an edge case of C development.
Having said that, I'd probablly go with #1 still. Perhaps using init and finalize/dispose (rather than destroy) for names.