0

以下是否合法?

const int n=10;
static int array[n];

如果是,那么为什么以及如何?

4

3 回答 3

4

请注意,在 C 语言中,const对象不能作为常量。它们不能用于构建常量表达式。在您的代码示例n中不是 C 语言术语中的常数。表达式n不是 C 中的整数常量表达式。

(请参阅“static const”与“#define”与“enum”以及为什么这个 C 程序不能编译?这有什么问题?有关更多详细信息。)

这立即意味着您的声明array是试图声明一个可变长度数组。可变长度数组只允许作为自动(本地)对象。一旦您声明了具有静态存储持续时间的数组,其大小必须是一个整数常量表达式,即编译时常量。您n不符合此类条件。该声明不合法。

这就是为什么在 C 语言中我们主要使用#define和/或enum引入命名常量而不是const对象的原因。

于 2014-10-11T06:09:43.803 回答
2
const int n=10;
static int array[n];

此代码将遇到错误:

'array' 的存储大小不是常量 static int array[n];
                                        ^

静态内存分配是指在执行相关程序之前在编译时保留内存的过程,这与动态内存分配或自动内存分配不同,后者在运行时根据需要分配内存。

const在 C 中不要使该变量在编译时可用。

像这样的语句不会产生该错误:

static int array[10];

因此,您编写的语句是非法的,或者在编译程序时遇到错误。

于 2014-10-11T05:56:28.503 回答
0

静态变量必须在编译时分配,因此必须在编译时知道它们的大小和初始化值(如果有的话)。有人可能会争辩说,使用编译时优化 n var 将/可以用常量值 10 替换,因此有可能成功编译该特定情况。

于 2014-10-11T05:37:15.437 回答