Variables de apilamiento frente a variables de montón
Estoy en lo cierto al pensar que:
char *buff[500];
... crea una variable de pila y:
char *buff = (char *)malloc(500);
... crea una variable de montón?
Si eso es correcto, ¿cuándo y por qué usaría las variables de montón sobre las variables de pila y viceversa? Entiendo que la pila es más rápida, ¿hay algo más?
Una última pregunta, ¿es la función principal un marco de pila en la pila?