C ++数组-表达式必须具有常数
当我尝试从声明的变量创建数组时出现错误。
int row = 8;
int col= 8;
int [row][col];
为什么会出现此错误:
表达式必须具有恒定值。
Nicholas Kong asked 2020-07-30T21:47:35Z
7个解决方案
48 votes
创建这样的数组时,其大小必须恒定。 如果需要动态调整大小的数组,则需要在堆上为其分配内存,完成后还需要使用delete释放它:
//allocate the array
int** arr = new int*[row];
for(int i = 0; i < row; i++)
arr[i] = new int[col];
// use the array
//deallocate the array
for(int i = 0; i < row; i++)
delete[] arr[i];
delete[] arr;
如果要固定大小,则必须将它们声明为const:
const int row = 8;
const int col = 8;
int arr[row][col];
也,
int [row][col];
甚至不提供变量名。
Foggzie answered 2020-07-30T21:48:08Z
17 votes
该标准要求数组长度必须是在编译时可计算的值,以便编译器能够在堆栈上分配足够的空间。 在您的情况下,您试图将数组长度设置为在编译时未知的值。 是的,我知道编译器应该知道它是显而易见的,但是这里不是这种情况。 编译器不能对非常数变量的内容做任何假设。 所以去:
const int row = 8;
const int col= 8;
int a[row][col];
UPD:实际上,有些编译器将允许您完成此操作。 IIRC,g ++具有此功能。 但是,请不要使用它,因为您的代码将无法在编译器之间移植。
answered 2020-07-30T21:48:33Z
15 votes
C ++不允许将非恒定值用作数组的大小。 那就是它的设计方式。
C99允许数组的大小为变量,但是我不确定二维是否允许。 一些C ++编译器(gcc)允许将此作为扩展,但是您可能需要打开编译器选项才能允许它。
而且我几乎错过了它-您需要声明一个变量名,而不仅仅是数组维。
Mark Ransom answered 2020-07-30T21:49:02Z
8 votes
您可以使用#define作为替代解决方案,它不会引入vector和malloc,并且在定义数组时仍使用相同的语法。
#define row 8
#define col 8
int main()
{
int array_name[row][col];
}
sjtupuzhao answered 2020-07-30T21:49:22Z
6 votes
当您在此处声明变量时
int a[10][10];
您告诉C ++编译器,要在运行时在程序的内存中分配100个连续的整数。 然后,编译器将为您的程序提供足够的可用内存,并且一切正常。
但是如果你告诉编译器
int x = 9001;
int y = 5;
int a[x][y];
如果不进行大量非常复杂的分析来跟踪x和y值更改的每个最后位置(如果有),编译器将无法知道在运行时实际需要多少内存。 C ++和C强烈建议(如果不是完全不要求)使用malloc()手动分配所需的空间,而不是支持此类可变大小的数组。
TL; DR
int x = 5;
int y = 5;
int **a = malloc(x*sizeof(int*));
for(int i = 0; i < y; i++) {
a[i] = malloc(sizeof(int*)*y);
}
现在,a是大小为5x5的2D数组,其行为与int a [5] [5]相同。 因为您已经手动分配了内存,所以C ++和C也要求您手动删除它。
for(int i = 0; i < x; i++) {
free(a[i]); // delete the 2nd dimension array
}
free(a); // delete a itself
arrdem answered 2020-07-30T21:50:04Z
0 votes
您还可以使用固定长度的向量,并通过索引进行访问,但这与使用指针相比,空间效率较低
int Lcs(string a, string b)
{
int x = a.size() + 1;
int y = b.size() + 1;
vector> L(x, vector(y));
for (int i = 1; i < x; i++)
{
for (int j = 1; j < y; j++)
{
L[i][j] = a[i - 1] == b[j - 1] ?
L[i - 1][j - 1] + 1 :
max(L[i - 1][j], L[i][j - 1]);
}
}
return L[a.size()][b.size()];
}
BigChief answered 2020-07-30T21:50:24Z
-3 votes
不,它不需要是常量,上面他的代码错误的原因是因为他需要在声明之前包含一个变量名。
int row = 8;
int col= 8;
int x[row][col];
在将无任何问题地编译和运行的Xcode中,在.NET中的M $ C ++编译器中,它将无法编译,它将抱怨您不能使用非const常量来初始化数组,大小需要在编译时知道
answered 2020-07-30T21:50:49Z