数组大小在运行时确定

lang2

我看到这样的一些代码:

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

  /* whatever */
}

我对它如何工作甚至无法编译感到困惑gcc数组的大小应该是静态的,并且是在编译时确定的,不是吗?

沙菲克·雅格莫(Shafik Yaghmour)

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

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

使用-std=c99 -pedantic不会产生警告,虽然两者gccclang支持VLA以外C99模式以及在C ++不允许VLA作为扩展

我们可以从C99草案标准部分的6.7.5.2 数组声明器4段中看到强调我的):

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章