使用变量定义数组的大小
Defining the size of array using variable
这在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.1
节 fprintf函数,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 即函数参数
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- C++编程从外部文本文件定义数组大小
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 删除动态数组时未定义标识符
- 在定义字符数组(井字游戏)的 for 循环中应用输入限制
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 模板类中的数组定义
- C 结构数组定义
- 在C++中为指针数组定义NULL
- 为什么局部变量不隐藏数组定义中的全局变量
- 静态数组定义错误 C++
- C++ 二维数组定义
- 这是否是 C++ 中的有效 2D 数组定义
- 模板类数组定义不是类型名称、静态或枚举器C++
- 用静态2d数组定义类的方便方法是什么(并且2d数组的大小只有在编译时才知道)
- 如何将字符数组定义为常量
- 二维数组定义
- 如何保护数组定义,防止使用非零值进行不完整的初始化
- 为3D数组定义setter/getter属性
- 在静态成员数组定义中对自身使用sizeof操作符