>>16
Don't worry. In probably 90%+ cases the correct answer is in fact fixed size arrays. It's just those maybe 10% where one of the other solutions becomes an option.
"Smart" arrays can be very efficient though if the default case is really a fixed size array of "sufficient" size and the whole logic (including whatever kind of allocation) just happens in the unlikely case "sufficient" wont actually cut it (like you start with X preallocated elements on the stack and if that runs out it gets extended to X*2 - how that's done exactly is of course a question in itself with pro/cons for each option). Basically a safety net that in general isn't used anyways.
>>17
Absolutely. Even if malloc often times won't result in an allocation in the stricter sense (ie just handing out a chunk of some preallocated memory) the function call alone is Bad with a major B. If it actually results in a system call all hope is lost.