以下是否合法?
const int n=10;
static int array[n];
如果,是的,那么为什么以及如何?
答案 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替换,因此可能成功编译该特定情况。