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;