使用变量定义数组的大小

时间:2013-10-02 10:59:35

标签: c++ c arrays

这在C语言中有效吗?

#include <stdio.h>
int main()
{
  int i = 5;
  int a[i];     // Compiler doesn't give error here. Why?
  printf("%d",sizeof(a));  //prints 5 * 4 =20. 4 is the size of integer datatype.
  return 0;
}

编译器不会在语句int a[i];处给出错误。我不是一个常数,那么它怎么能成功编译?是因为我使用的是gcc编译器吗?是否允许在C ++中使用?

4 个答案:

答案 0 :(得分:17)

是的,从C99开始有效,称为variable-length array(VLA)。换句话说,它已经使用了大约14年的官方语言标准。

不,它在C ++中无效,see this question以获取详细信息。

另请注意,sizeof不是函数,因此可以写为printf("%zu\n", sizeof a);,它也使用size_t值的正确格式说明符。

答案 1 :(得分:2)

这是有效的 C99 它被称为Variable Length Array VLA gcc支持 C99之外的VLA as an extension < / em>模式相对于 C ++ gccclang都支持可变长度数组作为扩展,即使这实际上是 C99 功能。

您可以使用-pedanticgcc中的clang参数进行构建,两者都会发出类似于以下内容的警告:

warning: variable length arrays are a C99 feature [-Wvla-extension]

sizeof预计可以与 VLA 一起正常工作,尽管它将被评估而不是整数常量。虽然您的代码中确实有undefined behavior,但您为 size_t 指定了错误的格式说明符,zu而不是d7.19.6.1 部分中的C99 draft standard fprintf函数 printf的部分引用的格式字符串段落 9 表示:

  

如果转换规范无效,则行为未定义。[...]

答案 2 :(得分:0)

我只想添加到unwind的答案,在C ++ 14中,将有运行时大小的数组,它与VLA几乎相同。

请参阅N3690array of runtime bound of T

中的第8.3.4章

它们似乎在clang-3.3中支持(在C ++ 1y模式下),但不在GCC 4.8中(支持应该在GCC 4.9中)。 当您在C ++ 14之前的模式(c ++ 03,c ++ 11)中编写代码时,您的代码可能会编译,但它应该发出警告,使用C ++不支持的C99功能。

你总是应该编译并启用大多数迂腐警告:)

答案 3 :(得分:-1)

Sizeof运算符与编译器无关。

您可以在以下链接::

中阅读更多相关信息

VLA-as-function-argument