我看到一些像这样的代码:
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
我对这将如何工作感到困惑,甚至用gcc
进行编译。数组的大小应该是 static 并在编译时确定,没有?
答案 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 模式以外的gcc
和clang
都支持 VLA 在 C ++ 中,它不允许 VLA 作为extension。
我们可以从C99 draft standard部分6.7.5.2
数组声明符段 4 中看到(强调我的):
如果大小不存在,则数组类型为不完整类型。如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型范围的声明中使用; 124)此类数组仍然是完整类型。如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。