Меня беспокоят массивы переменной длины. Когда я хочу выделить массив динамически, я получу ноль, если невозможно выделить достаточно памяти, и я могу правильно отреагировать на это в своей программе. С массивом переменной длины я не получаю эту информацию. Что мне с этим делать?
Безопасно ли использовать массивы переменной длины?
Ответы (1)
Вы правы в том, что VLA практически всегда небезопасны. Единственным исключением является то, что если вы гарантируете, что никогда не сделаете их больше, чем размер, вы чувствовали бы себя в безопасности, создавая массив фиксированного размера, и в этом случае вы могли бы просто использовать массив фиксированного размера. Существует один малоизвестный класс рекурсивных алгоритмов, в которых VLA могут иметь значение между неспособностью решить проблему (переполнение стека) и возможностью, но по большей части я бы рекомендовал никогда не использовать VLA.
Однако это не означает, что типы VLA бесполезны. Хотя VLA — это плохо или опасно, типы указатель на VLA чрезвычайно полезны. Они позволяют динамически распределять (через malloc
) многомерные массивы без выполнения арифметических операций вручную, как в:
size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);
чтобы получить матрицу n на n, адресуемую как matrix[i][j]
.
n*n
для указателя на массив n
double
s?
- person haccks; 05.06.2014
n
), поэтому вам нужен указатель на double[n]
. Вызов malloc
выделяет место для n
таких массивов (sizeof *matrix
дает размер одного такого массива), так что вы получаете указатель на первый элемент массива из n
double[n]
объектов — двумерного массива.
- person R.. GitHub STOP HELPING ICE; 05.06.2014
alloca
. - person phuclv   schedule 24.07.2015