En C lo que sucede es que el array se crea en la pila, lo cual puede no ser recomendable por varias razones:
- Al salir de la función se perderá el array... cuidado con los punteros que referencien el array
- Si no se controla el tamaño del array puedes acabar teniendo buffer overflow con suma facilidad.
Al final casi lo más cómodo es quitarse de problemas y reservar la memoria de forma dinámica.