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

时间:2013-10-24 03:06:20

标签: 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);
}

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

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

  
    

表达式必须具有恒定值

  

  
    

C2057:预期的常量表达式“编译错误。

  

2 个答案:

答案 0 :(得分:12)

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

int Amta[size];

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

int Amta[1024];

然后,如果你想小心(你应该),你可以检查if (size > 1024)并在用户想要的大小超出预先分配的界限时打印错误。

如果您想获得幻想,可以定义Amta没有预先设定的尺寸,例如int *Amta;,然后稍后使用malloc进行分配:

Amta = (int *)malloc(sizeof(int) * size);

然后,当你完成它之后,你还必须免费Amta

free(Amta);

答案 1 :(得分:4)

C++ doesn't allow variable length arrays。大小必须是常数。 C99支持它,所以如果需要,可以使用符合C99的编译器。一些编译器,如GCC and Clang also support VLA as an extension in C++ mode

但如果必须使用C ++,那么可以使用alloca()(或_alloca on Windows)在堆栈中分配内存并模仿C99可变长度数组行为

Amta = (int *)alloca(sizeof(int) * size);

这样你就不需要在走出示波器后释放内存,因为它会自动弹出堆栈。但是you need to be very careful while using this。为了这些目的,在C ++中使用std::vector仍然更好