【问题标题】:C++ declare an array based on a non-constant variable?C ++声明基于非常量变量的数组?
【发布时间】:2019-02-23 19:55:26
【问题描述】:
void method(string a) {
  int n = a.size();
  int array[n];
}

以上代码使用gcc可以正确编译。数组的大小如何来自非常量变量?编译器是否会自动将int array[n] 转换为int* array = new int[n]

【问题讨论】:

  • 这是一个编译器扩展。
  • 使用const。使用参考。使用向量
  • 使用 GCC,用-pedantic-errors 编译你的代码,然后看看它说了什么!
  • @Nawaz:然后用-std=c++1y 编译,看看它说了什么。
  • @MikeSeymour:呵呵....

标签: c++ arrays dynamic


【解决方案1】:

数组的大小如何来自非常量变量?

目前,因为该编译器有一个非标准扩展,允许您在 C++ 程序中使用 C 的可变长度数组。

编译器是否会自动将int array[n] 转换为int* array = new int[n]

这是一个实现细节。我相信 GCC 将它放在堆栈上,就像普通的自动变量一样。如果堆栈的大小太大,它可能会也可能不会使用动态分配;我自己都不认识。

【讨论】:

    【解决方案2】:

    根据this,编译器允许在 C++ 中使用此表达式,直到 C90/99。

    【讨论】:

      【解决方案3】:

      动态分配。 new 关键字将使用指针和一些分配来执行此操作。

      int * ptr;
      int n = a.size();
      ptr = new int[n];
      

      【讨论】:

      • 这样做的另一个好处是可以从函数返回指针地址,当函数返回时,静态创建的数组会从堆栈中删除
      • 该变量 ptr 可以像数组一样使用,例如你可以使用像ptr[a-1]这样的[]下标来访问数组的最后一个元素
      • 我认为这样做的一个缺点是您需要自己显式管理内存并记得稍后调用delete[]。真的,只需使用std::vector
      • 我建议使用答案下方的编辑按钮。但是,在 C++ 中通常不希望使用 new
      • @JacobMinshall,因为管理您自己的内存会给您的应用程序增加不必要的复杂性。你可能会说每次使用它时释放内存很简单,但如果它在一个类中,你需要额外的成员函数,并抛出一些异常,你就会得到很多额外的代码。相反,请使用正确的 RAII 容器,例如 std::vector 或智能指针。
      猜你喜欢
      • 2013-10-28
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多