Безопасно ли использовать массивы переменной длины? - PullRequest
13 голосов
/ 07 сентября 2011

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

1 Ответ

27 голосов
/ 07 сентября 2011

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

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

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

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

...