关于在Visual Studio 2022使用C++ 20语法的表达式开辟数组空间报错


错误原因

  1. c++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。

  2. 声明为const或constexpr的表达式在编译时计算结果不是常数。

  3. 编译器必须能够在表达式被使用时确定表达式的值。

错误示例

1
2
3
4
5
6
7
8
9
10
//错误示范1
#include <iostream>
using namespace std;

int main()
{
int a = 3, b = 4, c = 5;
int d[a * b * c]; // error
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
//错误示范2
#include <iostream>
using namespace std;

int main()
{
int a = 3, b = 4, c = 5;
const int tmp = a * b * c;
int d[tmp]; // error,如错误原因2
return 0;
}

1
2
3
4
5
6
7
8
//错误示范3
struct test
{
static const int array_size; // error
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. 单变量分配
1
2
3
4
5
Type *p = new Type;
delete p;

Type *p = new Type(2); //动态分配内存并初始化
delete p;
  1. 一维数组申请
1
2
3
4
5
Type *p = new Type[n];
delete[] p;

Type *p = new Type[n]();//动态分配内存并初始化全部为0
delete[] p;
  1. 二维数组申请
1
2
3
4
5
Type **p = new Type *[m];
for (int i = 0; i < m; ++i)
{
p[i] = new Type[n];
}