2013-07-30 34 views
1

我已經開始學習C++了。我讀過數組的大小隻能在運行之前設置,動態數組可以在運行時設置。所以我期待這個失敗,但它沒有:C++:爲什麼int數組[大小]工作?

#include <iostream> 

int main() { 
    using namespace std; 
    int size; 
    cout << "enter array size:"; 
    cin >> size; 
    int i, score[size], max; //array size set to variable doesn't fail 
    cout << endl << "enter scores:\n"; 
    cin >> score[0]; 
    max = score[0]; 
    for (i = 1; i < size; i++) 
    { 
     cin >> score[i]; 
     if (score[i] > max) 
    max = score[i]; 
    } 
    cout << "the highest score is " << max << endl; 
    return 0; 
} 

這是最近的C++編譯器的新功能?它是否意識到我需要一個動態數組並創建它?

+3

這是一個非標準的例外。不要。 –

+1

@LuchianGrigore所以只有一些comilers支持它。所以應該被忽略。感謝您的幫助 – Ashley

+0

@Ashley我已經看到它在GCC中工作,但可能不適用於Visual Studio。這不是一個標準。 –

回答

4

可能您正在使用GCC編譯器,它有一個名爲Arrays of Variable Length的擴展名。

std::vector是C++中真正的動態數組。

To select this standard in GCC, use the option -std=c++11; to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings).

+0

如果你使用的是gcc並且你不想讓它被允許,我建議使用'-pedantic-errors'命令行標誌。 – BoBTFish

0

小心!未定義的整數不能保證是有價值的。一些編譯器將默認爲0,而其他編譯器將使用已經在內存中的任何垃圾位。出於這個原因,Visual Studio甚至不會讓我編譯。在設置大小變量之前,瀏覽代碼以查看分配內存的分數。可能大小因爲它編譯的是垃圾內存中的隨機整數,這意味着它可以在您每次執行時更改!

C風格的數組需要知道要分配多少連續的內存。這允許直接索引和其他優化。正如其他人所建議的那樣,std :: vector是C++中的標準動態容器,它在引擎蓋下使用了一個數組。

+0

_(忽略非標準數組[大小]初始化)爲了安全起見,我應該總是定義一個變量來避免垃圾值。 'int size = 0;'不依賴'cin >> size;' – Ashley

+0

btw Visual Studio允許使用單位值,但會發出警告 – spiritwolfform

+0

在調試模式下,Visual Studio默認將所有未初始化的值設置爲0。它不允許創建大小爲0的數組。錯誤C2057,C2466和C2133。 –

2

在目前和過去的所有標準中,該代碼是不合格的。可變長度數組是C99功能,不是C++功能,儘管一些編譯器確實將它作爲擴展提供。在即將到來的標準(預計是C++ 14,目前正在審查過程中)中,已經採用了其他名稱(稍微不同的語義)的類似特徵,因此預計這將成爲未來的標準。

注意,在一般情況下,也就是,不包括結合運行時的陣列(因爲它們在即將到來的標準命名),則數組的大小是靜態類型的對象的一部分,並在編譯時已知的。在VLA或運行時綁定數組的情況下,大小在編譯時是未知的,因此類型在某種程度上是類型中的第二類公民。這意味着你不能在模板中使用VLAs/ARB(因爲模板的代碼生成取決於類型,其中包括編譯時未知的大小)。

以同樣的方式存在其他限制,sizeof不是針對VLA的編譯時操作,它甚至不允許用於ARB,這些形式的數組只能用於具有自動存儲持續時間的對象(即在堆棧),你不能拿到陣列的地址(雖然你可以把第一個成員的地址),...

另一個需要考慮的重點是標準不能保證ARB的內存將被分配到堆棧上,並允許實現調用全局分配函數,儘管目的是編譯器將趕上堆棧並提供空間。

相關問題