7

这在 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

4 回答 4

17

是的,这从C99开始有效,称为可变长度数组(VLA)。换句话说,它已经成为官方语言标准大约 14 年了。

不,它在 C++ 中无效,有关详细信息,请参阅此问题

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

于 2013-10-02T11:00:01.670 回答
2

这是有效的C99,它被称为可变长度数组( VLA ) ,它gcc支持VLA 作为C99模式之外的扩展,相对于C++gccclang都支持可变长度数组作为扩展,尽管这确实是C99功能。

-pedantic您可以使用in 参数进行构建gccclang两者都会给出类似于以下内容的警告:

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

sizeof预计将与VLA一起正常工作,尽管它将被评估而不是整数常量。尽管您的代码中确实存在未定义的行为size_t,因为您为iszu和 not指定了错误的格式说明符dC99 标准草案第9 节中提到的格式字符串第97.19.6.1 的 fprintf 函数说:printf

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

于 2013-10-02T11:41:51.783 回答
0

我只想补充 unwind 的答案,在 C++14 中,会有运行时大小的数组,它们的工作方式与 VLA 几乎相同。

N3690 ( array 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 功能。

而且您始终应该在启用大多数迂腐警告的情况下进行编译:)

于 2013-10-02T11:38:58.983 回答
-1

Sizeof运算符独立于编译器。

您可以在以下链接中阅读更多相关信息::

VLA-as-function-argument

于 2013-10-02T11:16:36.943 回答