具有可变长度的静态数组

时间:2014-10-11 05:16:46

标签: c const static-array

以下是否合法?

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

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

3 个答案:

答案 0 :(得分:4)

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

(有关详细信息,请参阅"static const" vs "#define" vs "enum"Why doesn't this C program compile? What is wrong with this?。)

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

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

答案 1 :(得分:2)

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

此代码将遇到错误:

 storage size of ‘array’ isn’t constant static int array[n];
                                        ^

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

C don中的

const使该变量在编译时可用。

这样的声明不会产生错误:

static int array[10];

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

答案 2 :(得分:0)

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