2014-10-11 59 views
0

以下是合法的吗?可变长度的静态阵列

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

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

+0

该数组的长度不是可变的。 'n'是常量表达式,其值在编译时已知。 – 2014-10-11 05:35:24

+0

使用static或extern存储类speci fi er声明的数组对象不能有可变长度数组(VLA)类型。看到问题为什么不能使静态数组的大小变化? [复制] – 2014-10-11 05:36:30

+0

@R Sahu:这是不正确的。在C语言中'const'对象不符合编译时常量。这是C和C++语言之间的一个重要区别。 – AnT 2014-10-11 06:13:59

回答

3

请注意,在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对象。

0

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

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

此代码会遇到一个错误:

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

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

const in C donot make the variable available in compile-time。

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

static int array[10]; 

所以,你已经写好的声明是非法的,或者遇到错误,而在程序编译。