以下是否合法?
const int n=10;
static int array[n];
如果是,那么为什么以及如何?
请注意,在 C 语言中,const
对象不能作为常量。它们不能用于构建常量表达式。在您的代码示例n
中不是 C 语言术语中的常数。表达式n
不是 C 中的整数常量表达式。
(请参阅“static const”与“#define”与“enum”以及为什么这个 C 程序不能编译?这有什么问题?有关更多详细信息。)
这立即意味着您的声明array
是试图声明一个可变长度数组。可变长度数组只允许作为自动(本地)对象。一旦您声明了具有静态存储持续时间的数组,其大小必须是一个整数常量表达式,即编译时常量。您n
不符合此类条件。该声明不合法。
这就是为什么在 C 语言中我们主要使用#define
和/或enum
引入命名常量而不是const
对象的原因。
const int n=10;
static int array[n];
此代码将遇到错误:
'array' 的存储大小不是常量 static int array[n]; ^
静态内存分配是指在执行相关程序之前在编译时保留内存的过程,这与动态内存分配或自动内存分配不同,后者在运行时根据需要分配内存。
const
在 C 中不要使该变量在编译时可用。
像这样的语句不会产生该错误:
static int array[10];
因此,您编写的语句是非法的,或者在编译程序时遇到错误。
静态变量必须在编译时分配,因此必须在编译时知道它们的大小和初始化值(如果有的话)。有人可能会争辩说,使用编译时优化 n var 将/可以用常量值 10 替换,因此有可能成功编译该特定情况。