Когда использовать массив переменной длины в C, но когда динамическое распределение?

Я узнал о массиве переменной длины в C99, но похоже, что он ведет себя почти так же, как malloc + free.

Практические различия, которые я нашел:

Слишком большая обработка массива:

unsigned size = 4000000000;
int* ptr = malloc(size); // ptr is 0, program doesn't crash
int array[size]; // segmentation fault, program crashes

Утечки памяти: возможно только при динамическом распределении массива:

int* ptr = malloc(size);
...
if(...)
    return;
...
free(ptr);

Жизнь объекта и возможность возврата из функции: динамически размещенный массив живет до тех пор, пока память не освободится и может быть возвращен из функции, которая выделяла память.

Изменение размера: изменение размера возможно только с указателями на выделенную память.

Мои вопросы:

Какие еще отличия (мне интересны практические советы)?Какие еще проблемы могут возникнуть у программиста с обоими способами массивов переменной длины?Когда выбрать VLA, но когда динамическое выделение массива?Что быстрее: VLA или malloc + free?

Ответы на вопрос(2)

Ваш ответ на вопрос