使用变量定义数组的大小

Defining the size of array using variable

本文关键字:数组 定义 变量      更新时间:2023-10-16

这在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++允许吗?

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

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

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

这是

有效的 C99,它被称为可变长度数组 (VLA),gcc支持 VLA 作为 C99 模式之外的扩展,C++ gcc 和 clang 都支持可变长度数组作为扩展,即使这确实是 C99 功能。

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

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

sizeof 应与 VLA 一起正常工作,尽管将对其进行计算而不是整数常量。尽管您的代码中确实存在未定义的行为,因为您为zu而不是d size_t指定了错误的格式说明符。C99草案标准在第7.19.6.1fprintf函数printf一节引用的格式字符串第9段说:

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

我只想补充一下 unwind 的答案,在 C++14 中,将有运行时大小的数组,其工作原理与 VLA 几乎相同。

请参阅 N3690 中的第 8.3.4 章 ( 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 功能。

而且您应该始终使用启用大多数迂腐警告进行编译:)

Sizeof运算符与编译器无关。

您可以在以下链接中阅读有关此内容的更多信息::

VLA 即函数参数