当我尝试从我声明的变量创建数组时出错.
int row = 8;
int col= 8;
int [row][col];
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误:
表达式必须具有常量值.
Fog*_*zie 49
创建这样的数组时,其大小必须是常量.如果你想要一个动态大小的数组,你需要在堆上为它分配内存,你还需要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;
Run Code Online (Sandbox Code Playgroud)
如果你想要一个固定的大小,那么它们必须被声明为const:
const int row = 8;
const int col = 8;
int arr[row][col];
Run Code Online (Sandbox Code Playgroud)
也,
int [row][col];
Run Code Online (Sandbox Code Playgroud)
甚至没有提供变量名称.
小智 17
该标准要求数组长度为在编译时可计算的值,以便编译器能够在堆栈上分配足够的空间.在您的情况下,您尝试将数组长度设置为编译时未知的值.是的,我知道很明显它应该为编译器所知,但这不是这里的情况.编译器不能对非常量变量的内容做任何假设.所以请跟:
const int row = 8;
const int col= 8;
int a[row][col];
Run Code Online (Sandbox Code Playgroud)
UPD:一些编译器实际上允许你关闭它.IIRC,g ++有这个功能.但是,永远不要使用它,因为您的代码将在编译器之间变得无法移植.
Mar*_*som 16
C++不允许数组大小的非常量值.这就是它的设计方式.
C99允许数组的大小是一个变量,但我不确定它是否允许两个维度.一些C++编译器(gcc)将允许它作为扩展,但您可能需要打开编译器选项以允许它.
我差点错过了 - 你需要声明一个变量名,而不仅仅是数组维.
小智 8
您可以使用#define作为替代解决方案,它不会引入vector和malloc,并且在定义数组时仍然使用相同的语法.
#define row 8
#define col 8
int main()
{
int array_name[row][col];
}
Run Code Online (Sandbox Code Playgroud)
当您在此处声明变量时
int a[10][10];
Run Code Online (Sandbox Code Playgroud)
您告诉C++编译器您希望在运行时在程序的内存中分配100个连续的整数.然后,编译器将为您的程序提供可用的内存,并且所有内容都适用于全世界.
但是,如果你告诉编译器
int x = 9001;
int y = 5;
int a[x][y];
Run Code Online (Sandbox Code Playgroud)
编译器无法在运行时知道您实际需要多少内存,而无需进行大量非常复杂的分析来追踪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);
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133770 次 |
| 最近记录: |