#include<iostream>
using namespace std;
main()
{
int m;
cin>>m;
int re[m];
cout<<sizeof(re);
}
此代碼在codeforces GNU C++ 4.7(但不是在我的Microsoft Visual C++)中運行完美。但爲什麼? 不應該數組大小是一個常數?這個C++代碼如何在GCC中運行但不是Visual C++?
#include<iostream>
using namespace std;
main()
{
int m;
cin>>m;
int re[m];
cout<<sizeof(re);
}
此代碼在codeforces GNU C++ 4.7(但不是在我的Microsoft Visual C++)中運行完美。但爲什麼? 不應該數組大小是一個常數?這個C++代碼如何在GCC中運行但不是Visual C++?
如你所提到的,C++數組大小必須是常量表達式。
- 使用VS,您將獲得:error C2057: expected constant expression
- GCC對標準進行了擴展,允許您的代碼進行編譯。
對於堆棧分配,數組大小需要在編譯時確定。但是數組的大小是在運行時確定的,所以它必須放在堆上。
使用
int *re = new int[m];
cout << m << endl;
delete[] re;
可變長度數組在C99中引入。標準C++不支持它,但GCC支持它作爲擴展:
有關詳細信息,請參閱GCC extension: Arrays of Variable Length。
正如其他人已經提到的,你的代碼是非標準C++,你有一個變長數組:
int m;
cin>>m;
int re[m]; // m is not a compile time constant!
GCC允許以此爲語言的擴展。如果您啓用-Wvla
,您會收到警告。 Afaik,如果你在gcc使用特定的C++標準,例如aus -std=c++11
,這段代碼就會被拒絕。
現在你_could做到這一點,而不是(如保羅·德雷珀已經寫)
int *re = new int[m]; // dynamic array allocation
delete[] re; // giving the memory back to the operating system
但是,C++提供了一個易於使用的包裝器這樣的:
std::vector<int> re(m);
對於大多數事情一樣,向量只是表現就像動態分配的陣列一樣,但是可以防止您意外忘記delete
或雙重delete
,並使數據更容易傳遞給函數。瞭解更多有關矢量cppreference.com。
我已經知道向量和動態分配...我只是想知道爲什麼這個代碼工作.... –
@TamojitChatterjee這很好,但其他人可能不會。有人可能會在未來發現這個問題。如果在至少一個答案中提到了可靠的備選方案,那麼這很好。 – stefan
是的,但沒有回答這個問題。 OP詢問它爲什麼在GCC中起作用。 –
嗯,是的,但這個問題可能會被問及任何事情。 「爲什麼這種非標準的東西不會崩潰?」 –