在运行时确定的数组大小

lan*_*ng2 6 c arrays gcc variable-length-array

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

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

  /* whatever */
}
Run Code Online (Sandbox Code Playgroud)

我很困惑这将如何工作,甚至编译gcc.数组的大小应该是静态的并在编译时确定,不是吗?

Sha*_*our 3

这是有效的 C99 功能,称为可变长度数组( VLA ),如果您使用它进行编译,gcc -std=c90 -pedantic您将收到以下警告:

\n\n
\n

警告:ISO C90 禁止可变长度数组 \xe2\x80\x98array\xe2\x80\x99 [-Wvla]

\n
\n\n

-std=c99 -pedantic尽管 和gccC99模式之外以及不允许VLA作为扩展的C++clang中都支持VLA ,但using不会产生警告。

\n\n

我们可以从C99草案标准部分6.7.5.2 Array declarators4段中看到(强调我的):

\n\n
\n

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

\n
\n\n

请注意,Visual Studio 不支持 VLA,尽管它们 现在支持 C99

\n