【问题标题】:Non-constant array size-initialization?非常量数组大小初始化?
【发布时间】:2022-03-10 12:28:23
【问题描述】:

来自 C++ 文档http://www.cplusplus.com/doc/tutorial/arrays/
要定义像 int a[b]; 这样的数组,变量 b 必须是常量。

这是我在 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 下运行的内容

int main(){
    int a = 10;
    int b[a];

    for(int i = 0; i < 10; i++){
        cout << b[i] << endl;
    }
    return 0;
}

变量a 不是常量,我没有错误。请问从什么版本的g++开始会接受这种数组定义?

【问题讨论】:

  • 好吧,在这种情况下,我希望编译器优化a,这样您实际上就可以使用常量进行初始化。尝试使用 rand()/100000 进行初始化,看看会发生什么 (#include &lt;cstdlib&gt;)
  • @MattPhillips 怀疑,优化器是在那之后很久才出现的。
  • @MattPhillips:优化不应该是相关的。语言规则需要一个常量表达式,而这只是意味着编译器能够在编译时弄清楚如何计算。

标签: c++ arrays


【解决方案1】:

编译器正在使用非标准扩展。您的代码无效,标准 C++。可变长度数组不是 C++ 的特性。

请注意,大小必须是编译时常量,而不仅仅是常量(即const)。

【讨论】:

  • “可变长度数组还不是 C++ 的特性”
  • @PeterT 希望永远不会。
  • 我的意思是 this 可能在 C++14 中。我也不是特别喜欢它,但有些人似乎非常想要它。更不用说他们拥有的所有新的特殊限制只会让初学者感到困惑
【解决方案2】:

在 GCC 中允许使用可变长度数组作为扩展。

GCC Docs

【讨论】:

    【解决方案3】:

    您不能在 C++ 中创建动态数组,因为您的编译器需要在编译之前知道您的程序有多大。 但是你可以用'new'创建一个数组:

    int *b = new int[a];

    这将创建一个保留新存储空间的新阵列。 您可以通过正常方式访问此数组。

    for(int i=0; i<a; i++)
    {
       b[i];
    }
    

    【讨论】:

      【解决方案4】:

      对于动态大小的数组,您可以在 C++ 中使用 std::vector(不完全是数组,但足够接近,如果您需要原始数组,则可以使用后备存储)。如果你坚持创建一个动态数据块,你可以简单地使用'new type[]'。

      int a = 100;
      int[] b = new int[a];
      

      【讨论】:

      • 感谢您的帮助,但这不是我想要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多