2017-02-11 45 views
1

請看下面2節目段:數組聲明和編譯時間

int a,b; 
    cin>>a>>b; 
    int arr1[a*b]; 
    int arr2[a]; 
現在

如果我給的「A」 = 100000和「b」 = 5的輸入值,程序顯示了運行時間錯誤,因爲內存溢出我想。現在看到的代碼的其他段:

int arr1[500000]; 
    int arr2[100000]; 

現在,當我聲明相同大小的陣列如上面的代碼,該程序工作正常。爲什麼?

+2

變長數組是不是在C++的支持。 – haccks

+2

@哈克斯說了些什麼。必須在編譯時知道C風格的數組和'std :: array'的大小。你可以使用'std :: vector'或動態分配一個數組。 – Gambit

+2

*「由於內存溢出,程序顯示運行時錯誤,我認爲」* - 請勿複述錯誤消息。使用複製和粘貼將其添加到問題。 –

回答

1

現在,當我在運行時聲明與我聲明的大小相同的數組時,程序工作正常。爲什麼?

因爲變長數組(也稱爲VLA)不是有效的標準C++代碼。

如果您需要在運行時分配這樣的事情真正地道的C++的方法是使用一個std::vector

int a,b; 
cin>>a>>b; 
std::vector<int> arr1(a*b); 
std::vector<int> arr2(a); 
+0

這裏我沒有使用可變大小的數組。重點是在兩個程序段中兩個數組的大小是一樣的。但第一段顯示錯誤,但第二段不顯示。 –

+0

@ShivaVerma _「但是第一段顯示錯誤」_這實際上是一個VLA,並且它不支持標準C++。 –

+0

*「我在這裏不使用可變大小的數組。」 - 是的,你是。你很可能使用g ++,它接受VLA作爲擴展。使用正確的編譯器標誌,它也會爲它們打印一條警告消息。做每個人都告訴你並使用'std :: vector'。 –