Подтвердить что ты не робот

Безопасно ли использовать массивы переменной длины?

У меня есть проблема с массивами переменной длины. Когда я хочу распределить массив динамически, я получу нуль, если невозможно выделить достаточное количество памяти, и я могу правильно ответить на это в своей программе. С массивом переменной длины я не получаю эту информацию. Что мне делать с этим?

4b9b3361

Ответ 1

Вы правы, что VLA в основном всегда опасны. Единственное исключение - если вы убедитесь, что вы никогда не делаете их больше, чем размер, который вы считаете безопасным, делая массив фиксированного размера, и в этом случае вы можете просто использовать массив фиксированного размера. Существует один неясный класс рекурсивных алгоритмов, где VLA может сделать разницу между невозможностью решить проблему (переполнение стека) и возможностью, но по большей части я бы рекомендовал никогда не использовать VLA.

Это не означает, что типы VLA бесполезны. В то время как VLA является плохим/опасным, типы указателей на VLA чрезвычайно полезны. Они позволяют распределять динамически распределенные (через malloc) многомерные массивы без выполнения арифметики измерения вручную, как в:

size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);

чтобы получить матрицу n-by-n, адресуемую как matrix[i][j].