2013-01-27 6 views
4

Я знаю, что массивы с длинами, определенных во время выполнения возможны при объявлении массива обычно:Есть ли способ, чтобы составной литерал имел переменную длину в c99?

char buf[len]; 

и я знаю, что может объявить массив в качестве составного litral и назначить его на указатель на полпути:

char *buf; 
.... 
buf = (char[5]) {0}; 

Однако объединение двух не работает (запрещено стандартом).

Мой вопрос: есть ли способ добиться эффекта от следующего кода? (примечание len)

char *buf; 
.... 
buf = (char[len]) {0}; 

спасибо.

+0

Почему 'memset' не вариант? –

+0

@AlexandreC. Я пытаюсь достичь того, что делает первый сегмент кода (динамически выделять память в стеке), используя составную литерал. – seininn

+1

Если вы не хотите писать действительный переносимый C, 'alloca' может быть использован ... –

ответ

7

язык явно запрещает данную

6.5.2.5 Составные литералы

сдерживающих

Имя типа указывается тип объекта или массив неизвестного размер, но не тип массива переменной длины.

Если вам нужно что-то подобное, вам придется использовать названный объект VLA вместо compund literal. Тем не менее, обратите внимание, что типы VLA не принимают инициализаторами, а это означает, что вы не можете сделать это

char buf[len] = { 0 }; // ERROR for non-constant `len` 

(я понятия не имею, что обоснование этого ограничения есть.)

Таким образом, в дополнение к использованию названный объект VLA, вам нужно будет каким-то образом его обнулить, например, memset или явный цикл.

+0

Спасибо за быстрый ответ (и const. Edits;)). Тем не менее, я знаю, что стандарт запрещает это. Я пытаюсь избежать засорения моего кода временными переменными и надеялся, что есть что-то с синтаксисом, который так же удобен, как сложные литералы. – seininn

+3

Мысль так, это позор, так как литералы переменных составных частей должны быть технически возможными, потому что VLAs. Надеюсь, следующий стандарт .. – seininn

+0

@seininn. Я согласен с вашим использованием для временных. Я думаю, что идеальная конструкция для этого использования была бы только первой частью составного литерала. Просто (float [n]) {} с пустым инициализатором, потому что все, что нам нужно, это пробел, и автоматическая инициализация массива переменной длины, вероятно, имеет ограниченную полезность. Он конфликтует с расширением gcc {}, но нулевой init также не будет ужасной сделкой. –

 Смежные вопросы

  • Нет связанных вопросов^_^