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