C++表达式必须具有常量值

G V*_*G V 6 c++ arrays const

#include <iomanip>
#include <iostream>
#include <Windows.h>
using namespace std;

template <class T>
void sort(int n, T a[]){
       for(i=0;i<n-1;i++){
          for(j=i;j<n;j++){
               if(a[i] > a[j]){
               temp=a[i];
               a[i]=a[j];
               a[j]=temp;
               }
           }
     }
}


void main(){
    int size;
    cout<<" Please input the amount of numbers you would like to sort"<<endl;
    cin>>size;
    int Amta[size];
    for(int i=0; i<size; i++){
        cout<<"Please enter the "<<size+1<< "number";
        cin>>Amta[i];
    }
    Sleep(100000);
}
Run Code Online (Sandbox Code Playgroud)

我试图获取用户想要从用户输入的数量并将其存储在可变大小中.

但是当我初始化时,array Amta[size]我得到以下编译错误:

表达式必须具有恒定值

C2057:预期的常量表达式"编译错误.

Aar*_*den 13

声明数组时,不能在括号之间输入非常量值:

int Amta[size];
Run Code Online (Sandbox Code Playgroud)

由于您是size从用户那里获得的,因此编译器无法提前告知需要多少内存Amta.这里最简单的事情(特别是练习)只是选择一个相对较大的值并使其成为常量分配,如:

int Amta[1024];
Run Code Online (Sandbox Code Playgroud)

然后,如果您想要小心(并且您应该)if (size > 1024),如果用户想要的大小超出预先分配的范围,您可以检查并打印错误.

如果你想得到想象,你可以定义Amta没有预先设定的大小,int *Amta;然后你稍后用malloc以下方式分配它:

Amta = (int *)malloc(sizeof(int) * size);
Run Code Online (Sandbox Code Playgroud)

那么Amta当你完成它之后你还必须免费:

free(Amta);
Run Code Online (Sandbox Code Playgroud)

  • C++中的`malloc`通常是一个糟糕的主意. (8认同)
  • 为什么要根据你为内存分配的类型来考虑使用什么?我默认使用`std :: vector`.作为奖励,我不需要清理. (3认同)
  • @AaronGolden 如果您(个人)正在编写需要并行独立数组分配的代码,并且需要对可简单构造的对象 * 和 * 类似的整数数组进行并排独立的数组分配,那么您会说,您将使用 `new` 作为对象,并使用 `malloc( )` 为 `int` 吗?那一定是多么有趣。 (2认同)