【问题标题】:Declaring Variable length arrays [duplicate]声明可变长度数组
【发布时间】:2012-12-17 00:19:10
【问题描述】:

可能重复:
Variable length arrays in C++?

我正在尝试形成一个数组,其大小由用户输入的另一个变量控制。我是 C++ 编码的初学者,我正在使用 Visual Studio 2008 专业编译器。 这是编译器显示错误的代码:

double kplus2(double a, double ks, double kr)
{
    int n = (ks-1)*100000;
    double x[n];

错误是

错误 2 错误 C2057:预期的常量表达式
错误 3 错误 C2466:无法分配常量大小为 0 的数组
错误 4 错误 C2133: 'x' : 未知大小

【问题讨论】:

标签: c++ visual-c++


【解决方案1】:

您需要动态分配内存,如下所示:

double *p = new double[n];

您可以像使用数组一样使用它,因为 C++ 中的指针语法很方便:

p[0] = 3.14;
p[n-1] = 1.14;

使用完后,必须使用 delete 运算符丢弃内存:

delete [] p;

请注意,我们使用 delete 运算符的矢量 [] 版本,因为我们使用了 new 运算符的矢量版本。

请注意,某些编译器有一个扩展,允许像您尝试编码的那样动态调整大小的本地数组。 gcc 就是这样一种编译器。这还不是语言标准的一部分,尽管有一天它可能会。

【讨论】:

  • -1 代表new[]delete[]
  • @dutt:嗯,它基本上在所有可以想象的方面都非常不安全,一方面。令人沮丧的是,有人赞成这个糟糕的答案。
  • @dutt 这会起作用,但它会带来不良风险,绝对没有回报。 std::vector 本质上是做同样的事情,但得益于良好的 RAII 等。我不会否决投票,因为它会在技术上工作;但有更好的解决方案。
  • @BenjaminLindley 就在他被 NSA 搜捕之前。
  • @Arivind:如果操作正确,使用指针动态分配与使用向量一样安全。问题是正确地做这件事需要做更多的工作。一次删除是不够的。你需要考虑在删除之前可能抛出的异常,否则它不会被执行,并且你有资源泄漏。考虑到所有这些,问题就变成了可维护性和可读性。向量是安全的,只有一行,它的声明。指针要求所有样板都是安全的,所以为什么要麻烦它呢?
【解决方案2】:

我正在尝试形成一个数组,其大小由用户输入的另一个变量控制。

C++ 已经具备此功能。它被称为std::vector 并位于标题<vector> 中。

double kplus2(double a, double ks, double kr)
{
    int n = (ks-1)*100000;
    std::vector<double> x(n);

【讨论】:

    【解决方案3】:

    您可以使用矢量。它也可以在运行时调整大小,因此如果您想添加更多数据,您不必担心创建所需大小的新数组并在其中复制当前数据。

    您可以使用向量,这是一种更好的方法来解决您的问题,因为它的风险较小;

    double kplus2(double a, double ks, double kr)
    {
      int n = (ks-1)*100000;
    
      vector<double> x(n);  // you don't have to worry about deallocating it cuz its a container. It can grow in size at run time
    
      ...
    
     return 0;
    
    }
    

    但是你也可以这样做:

    double kplus2(double a, double ks, double kr)
    {
      int n = (ks-1)*100000;
    
      double *x=new double[n]; // array of size i
    
      // you should also deallocate this dynamically allocated array at the end
    
    
      .....
    
      delete []x;
    
      return 0;
    

    }

    【讨论】:

    • 对于第二个示例,如果在newdelete 之间抛出异常怎么办?教手动内存管理很好,但请务必教它应该如何正确完成。
    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2012-05-28
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多