Есть ли способ для составного литерала иметь переменную длину в C99?
Я знаю, что массивы с длинами, определенными во время выполнения, возможны, если объявить массив как обычно:
char buf[len];
и я знаю, что могу объявить массив как составной литерал и назначить его указателю на полпути:
char *buf;
....
buf = (char[5]) {0};
Однако объединение двух не работает (не разрешено стандартом).
Мой вопрос: есть ли способ добиться эффекта следующего кода? (нота len
)
char *buf;
....
buf = (char[len]) {0};
Спасибо.
1 ответ
Язык явно запрещает это
6.5.2.5 Составные литералы
Ограничения
1 Имя типа должно указывать тип объекта или массив неизвестного размера, но не тип массива переменной длины.
Если вам нужно что-то вроде этого, вам придется использовать именованный объект VLA вместо литерала compund. Однако обратите внимание, что типы VLA не принимают инициализаторы, а это означает, что вы не можете сделать это
char buf[len] = { 0 }; // ERROR for non-constant `len`
(Я понятия не имею, в чем причина этого ограничения.)
Таким образом, в дополнение к использованию именованного объекта VLA вам придется придумать какой-то способ обнуления, например memset
или явный цикл.