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?

Respuestas a la pregunta(8)

Su respuesta a la pregunta