在运行时确定的数组大小

时间:2013-11-20 12:40:34

标签: c arrays gcc variable-length-array

我看到一些像这样的代码:

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

  /* whatever */
}

我对这将如何工作感到困惑,甚至用gcc进行编译。数组的大小应该是 static 并在编译时确定,没有?

3 个答案:

答案 0 :(得分:4)

这种类型的数组称为variable length arrays(您还想raed:Arrays of Variable Length - GCC)并且只允许在C99中使用。通过使用VLA,可以在运行时确定阵列的大小。

答案 1 :(得分:4)

“在编程中,可变长度数组(或VLA)是自动存储持续时间的数组数据结构,其长度在运行时确定(而不是在编译时)。” (Wikipedia

他们在C99(以及随后在C11中)得到支持。

详细了解其工作原理:The New C: Why Variable-length Arrays?

答案 2 :(得分:2)

这是有效的C99功能variable length arrays VLA ),如果使用gcc -std=c90 -pedantic进行编译,您将收到以下警告:

  

警告:ISO C90禁止变长数组'array'[-Wvla]

使用-std=c99 -pedantic不会产生警告,但{em} C99 模式以外的gccclang都支持 VLA C ++ 中,它不允许 VLA 作为extension

我们可以从C99 draft standard部分6.7.5.2 数组声明符 4 中看到(强调我的):

  

如果大小不存在,则数组类型为不完整类型。如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型范围的声明中使用; 124)此类数组仍然是完整类型。如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。

请注意Visual Studio does not support VLA,即使他们now support C99