Tralasciando le questioni di performance (premature optimization is the root of all evil), la cosa è un pelo delicata.
Un esempio semplice per capire come il compilatore tratta differentemente le cose:
Codice:
char mio_array[20];
printf("SizeOf: %lu\n", sizeof(mio_array)); // stampa 20
Codice:
char* mio_array = alloca(20); // alloca 20 bytes sullo stack
printf("SizeOf: %lu\n", sizeof(mio_array)); // stampa 4 o 8 (a seconda dei casi)