Есть ли способ для составного литерала иметь переменную длину в 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 или явный цикл.

Другие вопросы по тегам