[英]How is this C++ code running in GCC but not Visual C++?
#include<iostream>
using namespace std;
main()
{
int m;
cin>>m;
int re[m];
cout<<sizeof(re);
}
這段代碼在代碼GNU C ++ 4.7中運行得很好(但不是在我的Microsoft Visual C ++中)。 但為什么? 數組大小不應該是常數嗎?
如前所述,C ++數組大小必須是常量表達式。
- 使用VS,您將得到: error C2057: expected constant expression
- GCC具有標准的擴展,允許您的代碼進行編譯。
可變長度數組在C99中引入。 標准C ++不支持它,但GCC支持它作為擴展:
有關詳細信息,請參閱GCC擴展:可變長度數組 。
對於堆棧分配,需要在編譯時確定數組大小。 但是數組大小是在運行時確定的,因此它必須在堆上。
采用
int *re = new int[m];
cout << m << endl;
delete[] re;
正如其他人已經提到的,你的代碼是非標准的C ++,因為你有一個可變長度的數組 :
int m;
cin>>m;
int re[m]; // m is not a compile time constant!
GCC允許這作為語言擴展 。 如果啟用-Wvla
收到警告。 Afaik,如果你想讓gcc使用特定的c ++標准,例如aus -std=c++11
,那么這段代碼就會被拒絕。
現在你可以這樣做(正如Paul Draper已經寫過的那樣)
int *re = new int[m]; // dynamic array allocation
delete[] re; // giving the memory back to the operating system
但是,C ++提供了一個易於使用的包裝器:
std::vector<int> re(m);
對於大多數情況,vector的行為就像一個動態分配的數組,但可以防止您意外忘記delete
或雙重delete
,並使數據更容易傳遞給函數。 在cppreference.com上了解有關矢量的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.