C++ 为带有变量的数组指定大小

C++ 为带有变量的数组指定大小,c++,arrays,C++,Arrays,我一直试图通过一个变量给出数组的大小,但它不起作用,因为“必须有一个常量值” 我遗漏了什么吗?正如您所看到的,您可以声明一个非常量大小的数组,如下所示。但是,您可以使用new动态分配它: int* wt = new int[n]; int* tat = new int[n]; 只是不要忘记,完成后需要删除[]这些数组。您可以像Mureinik所说的那样在堆上分配它,但您也可以像这样使用alloca()在堆栈上分配它(正如您尝试的那样): int* wt = (int*)alloca(n * s

我一直试图通过一个变量给出数组的大小,但它不起作用,因为“必须有一个常量值”


我遗漏了什么吗?

正如您所看到的,您可以声明一个非常量大小的数组,如下所示。但是,您可以使用
new
动态分配它:

int* wt = new int[n];
int* tat = new int[n];

只是不要忘记,完成后需要
删除[]
这些数组。

您可以像Mureinik所说的那样在堆上分配它,但您也可以像这样使用
alloca()
在堆栈上分配它(正如您尝试的那样):

int* wt = (int*)alloca(n * sizeof(int));
int* tat = (int*)alloca(n * sizeof(int));
free()
不应被调用,因为它是在堆栈而不是堆上分配的


有人说使用
alloca()
是不好的做法,因为如果调用导致堆栈溢出,则程序行为未定义。只要阵列不太长,这应该不是问题。

使用
std::vector
代替:)检查一下,它可能会帮助您几乎没有最终用户真正需要使用
new
。这里有
std::vector
。如果他使用
std::unique\u ptr
,他就不需要考虑删除。但是无论如何,正如前面所说,标准库中有用于动态数组的向量。如果您的编译器支持
alloca
,则可以这样做。它不是OS标准C++。当然,但是大多数(如果不是全部)主流编译器支持它,我测试编译器编译器上几乎所有编译器,它得到了支持。(MSVC不起作用,但我知道它支持它。)
int* wt = (int*)alloca(n * sizeof(int));
int* tat = (int*)alloca(n * sizeof(int));