Вы можете создать указатель на VLA:
size_t rows, cols;
... // get values for rows and cols
T (*arr)[cols] = malloc(sizeof (T [cols]) * rows);
if (arr)
{
...
arr[i][j] = some_value;
...
}
Существует некоторая дискуссия по поводу того,
T (*arr)[cols] = malloc(sizeof *arr * rows);
должен работать. Образом стандарт сформулирован, эта форма приводит к неопределенному поведению, так как sizeof
должно оценить *arr
во время выполнения (так как выражения*arr
относятся к VLA) и arr
является недействительным, когда указателем sizeof *arr
оценивается.
Однако это зависит от того, что означает «оценка» в этом конкретном контексте; нет никаких причин, чтобы иметь в разыменоватьarr
для того, чтобы определить размер массива он указует, больше, чем вы бы для массива фиксированной длины:
T (*arr)[10] = malloc(sizeof *arr * rows);
Я и несколько других из мнение, что стандарт плохо сформулирован в этом отношении и что sizeof *arr
должен быть действительным, если arr
указывает на фиксированный-или массив переменной длины. Это идиома, которую я использую, и это не сработало на мне ... еще.
Но я был бы умен, если бы не указал на эту проблему, и предоставил вам то, что знаю не будет результат UB.
@ user3528438 Я спрашиваю ** конкретно ** о типе данных массива переменной длины. Кроме того, 5D, серьезно? –
Что работает для 5D, можно свести к работе для 2D. Вы пробовали 'calloc (sizeof (int [rows] [cols]), 1)'? Какой размер вы получили? На самом деле более актуальным является печать значений 'rows',' cols' и выражения 'sizeof'. Он дает вам то, что вам нужно? Возникает вопрос «Что мне назначить результат»? –
@ TomášZato 5D? Да серьезно! Почему нет? –