当我尝试使用此代码时,它可以运行:
const int i = 5;
int main() {
int arry[i];
}
即使这不起作用:
const int i = 5;
int arry[i];
int main() {
}
我已经阅读了有关常量大小的数组的所有帖子,但我无法理解为什么在main中声明arry
时它起作用。
答案 0 :(得分:9)
这里的问题是C中的const
不会产生真正的常量。
当您编写const int i = 5
时,您拥有的是只读变量而不是常量。在C99中,使用i
标注的数组是可变长度数组(VLA)。 VLA仅适用于堆栈分配的变量,因此您看到了编译错误。
如果您需要具有全局范围的数组,则应切换到宏。
#define ARRAY_SIZE 5
int arry[ARRAY_SIZE];
这是有效的,因为5
是一个真正常量的文字。
实际上,即使是一个自动存储阵列(即堆栈分配的局部变量),也应避免使用VLA,因为它们会产生运行时开销。
答案 1 :(得分:1)
版本2根本不是有效的C,因为i
是只读变量而不是真正的编译时常量。如果你想让它工作,你可以使用malloc
和free
(或大小为#define
)。
版本1使用可变长度数组,这是C99的标准功能。 gcc
在C99之前的代码中支持此语法作为扩展。如果您将代码编译为C90并打开-pedantic
,则会收到ISO C90 forbids variable length array ‘arry’
的警告。