c ++数组 - 表达式必须具有常量值

Nic*_*ong 44 c++ arrays

当我尝试从我声明的变量创建数组时出错.

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)

甚至没有提供变量名称.

  • 也许会展示如何删除内存,嗯?;) (6认同)
  • @BhupeshPant 这个问题被标记为 C++,所以我不做假设。无论如何,使用 C 只会意味着你使用 `malloc` 而不是 `new` 指向指针的指针: `int **arr = (int **)malloc(row * sizeof(int *));` 然后填写相同的内容方式,使用循环: `for (i=0; i&lt;row; i++) { arr[i] = (int *)malloc(col * sizeof(int)); }` (3认同)

小智 17

该标准要求数组长度为在编译时可计算的值,以便编译器能够在堆栈上分配足够的空间.在您的情况下,您尝试将数组长度设置为编译时未知的值.是的,我知道很明显它应该为编译器所知,但这不是这里的情况.编译器不能对非常量变量的内容做任何假设.所以请跟:

const int row = 8;
const int col= 8;
int a[row][col];
Run Code Online (Sandbox Code Playgroud)

UPD:一些编译器实际上允许你关闭它.IIRC,g ++有这个功能.但是,永远不要使用它,因为您的代码将在编译器之间变得无法移植.

  • 最简洁,正确的答案。 (2认同)
  • const 在 C 世界中确实没有意义。#include &lt;stdio.h&gt; int main(void) { const int msg_len = 255; 字符 msg[msg_len+1]; printf("你好,世界!\n"); 返回0;这段代码仍然给我错误。 (2认同)

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)


arr*_*dem 7

当您在此处声明变量时

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)

  • 你的答案是无效的C++:你依赖于从`void*`到`int*`和`int**`的隐式转换.当然,如果你添加一个演员,那么几乎完全使用`malloc`仍然是不好的风格. (2认同)