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

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


person gruszczy    schedule 06.09.2011    source источник
comment
Это так же безопасно, как alloca.   -  person phuclv    schedule 24.07.2015


Ответы (1)


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

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

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

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

person R.. GitHub STOP HELPING ICE    schedule 06.09.2011
comment
Я никогда не рассматривал возможность использования VLA-casts для этого. Я всегда думал, что это будет высечено в камне. - person Chris Lutz; 07.09.2011
comment
Как это возможно, что вы выделяете память для матрицы n*n для указателя на массив n doubles? - person haccks; 05.06.2014
comment
@hackks: при динамическом размещении массива вы хотите, чтобы тип указателя соответствовал типу элементов массива, поскольку он будет указывать на первый элемент. (Обратите внимание, что это тот же тип, на который распадается массив.) В случае двумерного массива его элементами являются одномерные массивы определенной длины (здесь n), поэтому вам нужен указатель на double[n]. Вызов malloc выделяет место для n таких массивов (sizeof *matrix дает размер одного такого массива), так что вы получаете указатель на первый элемент массива из n double[n] объектов — двумерного массива. - person R.. GitHub STOP HELPING ICE; 05.06.2014
comment
@Р..; Спасибо за разъяснения. Прочитав ваш ответ, я подумал и, наконец, понял, но забыл удалить комментарий: P - person haccks; 06.06.2014
comment
примечание: правильная терминология для типов VLA — вариабельно модифицированный тип - person M.M; 30.09.2014