簡體   English   中英

C++ 表達式必須具有常量值

[英]C++ Expression must have constant value

#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:預期的常量表達式”編譯錯誤。

聲明數組時,不能在括號之間輸入非常量值:

int Amta[size];

由於您從用戶那里獲取size ,因此編譯器無法提前告知Amta需要多少內存。 在這里做的最簡單的事情(特別是對於練習)是只選擇一個相對較大的值並使其成為常量分配,例如:

int Amta[1024];

然后,如果您想小心(並且應該),您可以檢查if (size > 1024)並在用戶想要超出預先分配范圍的大小時打印錯誤。

如果你想獲得幻想,你可以定義Amta沒有預先設定的尺寸,像int *Amta; 然后你稍后用malloc分配它:

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

然后你還必須稍后釋放Amta ,當你完成它時:

free(Amta);

C++ 不允許變長數組 大小必須是常數。 C99 確實支持它,因此如果您需要,可以使用符合 C99 的編譯器。 一些編譯器如GCC 和 Clang 也支持 VLA 作為 C++ 模式下的擴展

但是,如果必須使用 C++,那么您可以使用alloca (或Windows 上的_alloca )在堆棧上分配內存並模仿 C99 可變長度數組行為

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

這樣你就不需要在超出范圍后釋放內存,因為堆棧幀會自動恢復。 但是,您在使用它時需要非常小心 出於這些目的,最好在 C++ 中使用std::vector

答案取決於“編譯器”。 每種編程語言或代碼都只是帶有某些特殊語言文本(源程序)的文本文件。 正是編譯器(或有時是解釋器)將我們的特殊語言“翻譯”成另一種目標語言。 因此,誰來構建此編譯器,是由誰可以做什么和不可以做什么負責。 因此,在這種情況下,您使用的c ++編譯器不支持“以后定義數組大小”。 如果使用G ++編譯器,則不會出現此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM