这在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 ++中使用?
答案 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 ++ gcc和clang都支持可变长度数组作为扩展,即使这实际上是 C99 功能。
您可以使用-pedantic
和gcc
中的clang
参数进行构建,两者都会发出类似于以下内容的警告:
warning: variable length arrays are a C99 feature [-Wvla-extension]
sizeof
预计可以与 VLA 一起正常工作,尽管它将被评估而不是整数常量。虽然您的代码中确实有undefined behavior,但您为 size_t
指定了错误的格式说明符,zu
而不是d
。 7.19.6.1
部分中的C99 draft standard fprintf函数 printf
的部分引用的格式字符串段落 9 表示:
如果转换规范无效,则行为未定义。[...]
答案 2 :(得分:0)
我只想添加到unwind的答案,在C ++ 14中,将有运行时大小的数组,它与VLA几乎相同。
请参阅N3690(array of runtime bound of T
)
它们似乎在clang-3.3中支持(在C ++ 1y模式下),但不在GCC 4.8中(支持应该在GCC 4.9中)。 当您在C ++ 14之前的模式(c ++ 03,c ++ 11)中编写代码时,您的代码可能会编译,但它应该发出警告,使用C ++不支持的C99功能。
你总是应该编译并启用大多数迂腐警告:)
答案 3 :(得分:-1)