【问题标题】:Static arrays with variable length可变长度的静态数组
【发布时间】:2014-10-11 05:16:46
【问题描述】:

以下合法吗?

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

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

【问题讨论】:

  • 数组不是可变长度的。 n 是常量表达式,其值在编译时已知。
  • 使用 static 或 extern 存储类说明符声明的数组对象不能具有可变长度数组 (VLA) 类型。请参阅问题为什么不能将静态数组的大小设为可变? [重复]
  • @R Sahu:这是不正确的。在 C 语言中,const 对象不符合编译时常量的条件。这是 C 和 C++ 语言之间的一个重要区别。

标签: c constants static-array


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    const int n=10;
    static int array[n];
    

    这段代码会遇到错误:

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

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

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

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

    static int array[10];
    

    所以,你写的语句是非法的,或者在编译程序时遇到错误。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2020-11-20
        相关资源
        最近更新 更多