簡體   English   中英

這個C ++代碼是如何在GCC中運行而不是在Visual C ++中運行的?

[英]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.

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