我看到一些这样的代码:
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
我对这将如何工作甚至使用gcc
. 数组的大小应该是静态的并在编译时确定,不是吗?
我看到一些这样的代码:
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
我对这将如何工作甚至使用gcc
. 数组的大小应该是静态的并在编译时确定,不是吗?
这种类型的数组称为可变长度数组(您还想阅读:可变长度数组 - GCC)并且仅在 C99 中允许使用。通过使用 VLA,可以在运行时确定数组的大小。
“在编程中,可变长度数组(或 VLA)是一种自动存储持续时间的数组数据结构,其长度在运行时(而不是在编译时)确定。” (维基百科)
它们在 C99 中得到支持(随后在 C11 中得到支持)。
阅读有关其工作原理的更多信息:新 C:为什么使用可变长度数组?
这是称为可变长度数组( VLA ) 的有效 C99 功能,如果您使用它进行编译,gcc -std=c90 -pedantic
您将收到以下警告:
警告:ISO C90 禁止变长数组 'array' [-Wvla]
using-std=c99 -pedantic
不会产生警告,尽管两者都gcc
支持clang
C99模式之外的VLA以及在不允许VLA作为扩展的C++中。
我们可以从C99 草案标准部分6.7.5.2
Array declarators第4段中看到(强调我的):
如果大小不存在,则数组类型是不完整的类型。如果大小是 * 而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型范围的声明中使用;124) 这样的数组仍然是完整类型。如果大小是整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是变长数组类型;否则,数组类型是可变长度数组类型。
请注意,Visual Studio 不支持 VLA,即使它们 现在支持 C99