6

我看到一些这样的代码:

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

  /* whatever */
}

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

4

3 回答 3

4

这种类型的数组称为可变长度数组(您还想阅读:可变长度数组 - GCC)并且仅在 C99 中允许使用。通过使用 VLA,可以在运行时确定数组的大小。

于 2013-11-20T12:41:57.780 回答
4

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

它们在 C99 中得到支持(随后在 C11 中得到支持)。

阅读有关其工作原理的更多信息:新 C:为什么使用可变长度数组?

于 2013-11-20T12:44:16.793 回答
3

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

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

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

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

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

请注意,Visual Studio 不支持 VLA,即使它们 现在支持 C99

于 2013-11-20T12:51:22.210 回答