Распределение массива переменной длины (или фактически любое объявление массива) выполняется в стеке (при условии компилятора GCC). Маллок выделяет память из кучи.
Два преимущества кучи против стека:
1. Стек намного меньше. Существует большая вероятность того, что ваш массив переменного размера может вызвать переполнение вашего стека.
2. Элементы, размещенные в стеке, не сохраняются после функции, которую они были объявлены в возвращениях.