Вы правы, что VLA в основном всегда небезопасны.Единственное исключение - если вы гарантируете, что никогда не сделаете их больше, чем размер, который вы чувствовали бы в безопасности, создавая массив фиксированного размера, и в этом случае вы могли бы просто использовать массив фиксированного размера.Существует один непонятный класс рекурсивных алгоритмов, в которых VLA могут сделать различие между неспособностью решить проблему (переполнение стека) и возможностью, но по большей части я бы рекомендовал никогда не использовать VLA.
не значит, что типы VLA бесполезны.Несмотря на то, что VLA плох / опасен, типы указатель на VLA чрезвычайно полезны.Они позволяют иметь динамически распределяемые (через malloc
) многомерные массивы, не делая арифметику вручную, как в:
size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);
, чтобы получить n-на-n матрицу, адресуемую как matrix[i][j]
.