C++ 声明可变长度数组

C++ 声明可变长度数组,c++,visual-c++,C++,Visual 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 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”:未知大小


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

double *p = new double[n];

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

p[0] = 3.14;
p[n-1] = 1.14;
一旦使用完毕,必须使用
delete
操作符丢弃内存:

delete [] p;
请注意,我们使用了
delete
运算符的vector[]版本,因为我们使用了
new
运算符的vector版本

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

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

C++已经有了这个功能。它被调用并存在于标题

双kplus2(双a、双ks、双kr)
{
int n=(ks-1)*100000;
std::向量x(n);

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

您可以使用vector&这是解决问题的更好方法,因为它风险较小

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;

}

}

使用
std::vector x(n)
令人沮丧的是这个问题的答案太多了。我建议使用
new
,我意识到这是错误的。请在这里阅读:“
new[]
delete[]
”@dutt:&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;从一。令人沮丧的是,有人对这个糟糕的答案投了更高的票。@dutt这会起作用,但它引入了不受欢迎的风险,而绝对没有回报。一个std::vector本质上做了同样的事情,但是有了良好的RAII等优点,我不会反对这个,因为它在技术上是可行的;但是有更好的解决办法。@BenjaminLindley就在被NSA抓获之前。@Arivind:如果操作正确,使用指针动态分配和使用向量一样安全。问题是正确地做这件事需要做更多的工作。一次删除是不够的。您需要考虑在删除之前可能引发的异常,否则它将不会执行,并且您存在资源泄漏。考虑到所有这些,问题变成了可维护性和可读性。向量只有一行是安全的,即它的声明。指针要求所有锅炉板都是安全的,那么为什么还要麻烦它呢?对于第二个示例,如果在
new
delete
之间抛出异常会怎么样?教授手动内存管理是可以的,但请确保教授如何正确地进行。
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;