2013-11-20 9 views
6

Я вижу некоторый код, как это:размер массива определяется во время выполнения

int foo() 
{ 
    int sz = call_other_func(); 
    char array[sz]; 

    /* whatever */ 
} 

Я сбит с толку, как это будет работать и даже компилировать с gcc. Предполагается, что размер массива статический и определяется во время компиляции, нет?

+1

А как она будет работать - почему бы не * * это работает? –

+0

Возможный дубликат [Как размер массива переменной длины, вычисленный во время выполнения в C99?] (Http://stackoverflow.com/questions/13908421/how-is-size-of-variable-length-array-computed-at- runtime-in-c99) –

+0

Возможный дубликат [Объявить массив с переменной] (http://stackoverflow.com/questions/19131712/declare-an-array-with-a-variable) –

ответ

2

Это действительно особенность C99 называется variable length arrays (VLA), если вы компилируете с gcc -std=c90 -pedantic вы получите следующее предупреждение:

предупреждение: ISO C90 запрещает массив переменной длины «-страх» [-Wvla]

с использованием -std=c99 -pedantic не будет про дуче предупреждение, хотя поддержка и gcc и clangVLA вне режима C99, а также в C++ который не позволяет VLA как extension.

Мы можем видеть из C99 draft standard секции 6.7.5.2массива declarators пункта говорит (курсив моего ):

Если размер нет, типа массива неполного типа. Если размер равен * вместо выражения, тип массива представляет собой массив переменных длины неопределенного размера, который может использоваться только в объявлениях с помощью области прототипа функции; 124) такие массивы, тем не менее, являются полными типами. Если размер представляет собой целочисленное константное выражение, а тип элемента имеет известный постоянный размер, тип массива не является массивом переменной длины; В противном случае тип массива представляет собой тип массива переменной длины.

Обратите внимание, что Visual Studio does not support VLA даже если они now support C99

4

Этот тип массивов называется variable length arrays (вы также хотели бы опробовать: Arrays of Variable Length - GCC) и разрешены только на C99. Используя VLA, размер массива можно определить во время выполнения.

+0

Хотя люди поддерживают этот ответ , не знаете, почему репутация не добавляется в мой профиль? – haccks

+1

Похоже, вы [rep capped] (http://meta.stackexchange.com/questions/32160/what-is-the-daily-reputation-cap-and-how-can-i-hit-it), поздравляем , –

+0

@ShafikYaghmour; Благодарю. Но многие пользователи получают репутацию около 275 или даже больше за один день (я это видел), как? – haccks

4

«При программировании массив переменной длины (или VLA) представляет собой структуру данных массива с автоматическим временем хранения, длина которого определяется во время выполнения (а не во время компиляции)». (Wikipedia)

Они поддерживаются в C99 (а затем в C11).

Узнайте больше о том, как это работает: The New C: Why Variable-length Arrays?

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