Когда использовать массив переменной длины в 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?