具有恒定大小的数组(全局与堆栈)

时间:2011-10-30 17:05:44

标签: c gcc

当我尝试使用此代码时,它可以运行:

const int i = 5;
int main() {
    int arry[i];
}

即使这不起作用:

const int i = 5;
int arry[i];
int main() {

}

我已经阅读了有关常量大小的数组的所有帖子,但我无法理解为什么在main中声明arry时它起作用。

2 个答案:

答案 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是只读变量而不是真正的编译时常量。如果你想让它工作,你可以使用mallocfree(或大小为#define)。

版本1使用可变长度数组,这是C99的标准功能。 gcc在C99之前的代码中支持此语法作为扩展。如果您将代码编译为C90并打开-pedantic,则会收到ISO C90 forbids variable length array ‘arry’的警告。