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

A.M*_*M.M 4 c gcc

当我尝试这个代码时它工作:

const int i = 5;
int main() {
    int arry[i];
}
Run Code Online (Sandbox Code Playgroud)

即使这不起作用:

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

}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 9

这里的问题是const在C中不会产生真正的常量.

当你写的const int i = 5是一个只读变量而不是常量.在C99中,尺寸i为的数组是可变长度数组(VLA).VLA仅适用于堆栈分配的变量,因此您看到的编译错误.

如果需要具有全局范围的数组,则应切换到宏.

#define ARRAY_SIZE 5
int arry[ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为5它是一个真正常量的文字.

实际上,即使是一个自动存储阵列(即堆栈分配的局部变量),您也应该避免使用VLA,因为它们会产生运行时开销.