关于在Visual Studio 2022使用C++ 20语法的表达式开辟数组空间报错
关键词:C++
错误原因
-
c++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。
-
声明为const或constexpr的表达式在编译时计算结果不是常数。
-
编译器必须能够在表达式被使用时确定表达式的值。
错误示例
1 2 3 4 5 6 7 8 9 10
| #include <iostream> using namespace std;
int main() { int a = 3, b = 4, c = 5; int d[a * b * c]; return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream> using namespace std;
int main() { int a = 3, b = 4, c = 5; const int tmp = a * b * c; int d[tmp]; return 0; }
|
1 2 3 4 5 6 7 8
| struct test { static const int array_size; int size_array[array_size]; };
const int test::array_size = 42;
|
解决方案
使用new
进行动态内存分配,记得通过delete
回收分配的内存,如上述代码改为:
1 2 3 4 5 6 7 8 9 10
| #include <iostream> using namespace std;
int main() { int a = 3, b = 4, c = 5; int *d = new int[a * b * c]; delete[] d; return 0; }
|
关于new分配内存的使用:
- 单变量分配
1 2 3 4 5
| Type *p = new Type; delete p;
Type *p = new Type(2); delete p;
|
- 一维数组申请
1 2 3 4 5
| Type *p = new Type[n]; delete[] p;
Type *p = new Type[n](); delete[] p;
|
- 二维数组申请
1 2 3 4 5
| Type **p = new Type *[m]; for (int i = 0; i < m; ++i) { p[i] = new Type[n]; }
|