c语言 数组 常数,C ++数组-表达式必须具有常数

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
。一元多项式的标准表达式可以用一个数组来表示,数组下标表示项的次数,数组元素表示该次数项的系数。例如,一个三次多项式f(x)=2x^3-3x^2+4x+1可以表示为: ```c float poly[4] = {1, 4, -3, 2}; ``` 其中,数组下标0对应x^0,即常数项系数为1,数组下标1对应x^1,即一次项系数为4,依此类推。可以通过循环遍历数组来输出多项式的标准表达式。 多项式相加的实现可以使用类似的循环遍历数组的方法,将同一次数的项的系数相加即可。例如,将两个三次多项式f(x)=2x^3-3x^2+4x+1和g(x)=x^3+2x^2+3x+5相加得到: ```c float poly1[4] = {1, 4, -3, 2}; float poly2[4] = {5, 3, 2, 1}; float result[4]; // 存放结果多项式的数组 int i; for(i=0; i<4; i++) { result[i] = poly1[i] + poly2[i]; } ``` 多项式相乘的实现比较复杂,可以使用嵌套循环遍历两个多项式的所有项,将相应次数项的系数相乘再累加得到结果多项式的相应项系数。例如,将f(x)和g(x)相乘得到: ```c float poly1[4] = {1, 4, -3, 2}; float poly2[4] = {5, 3, 2, 1}; float result[7]; // 存放结果多项式的数组,最高次为6 int i, j; for(i=0; i<7; i++) { result[i] = 0; for(j=0; j<=i; j++) { if(j<4 && (i-j)<4) { // 保证下标不越界 result[i] += poly1[j] * poly2[i-j]; } } } ``` 上述代码中,外层循环遍历结果多项式的所有项,内层循环遍历两个多项式的所有可能的项的乘积,并累加到结果多项式的相应项系数中。注意,结果多项式的最高次数是两个多项式最高次数之和减1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值