Я правильно понимаю, что:
char *buff[500];
... создает переменную стека и:
char *buff = (char *)malloc(500);
... создает переменную кучи?
Если это правильно, когда и почему вы используете переменные кучи над переменными стека и наоборот. Я понимаю, что стек быстрее, есть что-то еще.
Последний вопрос, является ли основная функция стек стека в стеке?