2016-09-13 11 views
2

私はC++で空のサイズの配列が違法、知っているが、私のコードでは、空のサイズの配列コンパイラが許可され、与え配列の宣言では、我々はこのintはなぜ[+] C++で許可されていますか?

int a[0]; 

のような、それのサイズを指定することはできませんことを見つけます出力。

私のコードはここにある:

#include <iostream> 
using namespace std; 

int main() 
{ 
     int a[0]; 

     a[0] = 10; 
     a[1] = 20; 

     cout<<a[0]<<endl; 
     cout<<a[1]<<endl; 

     return 0; 
} 

出力:

10 
20 

オンラインコンパイラのリンク:http://code.geeksforgeeks.org/TteOmO

だから、私の質問は、なぜ許さint a[0]されているGCCコンパイラ?

+0

'int a [0];を実行しています。 a [0] = 10; a [1] = 20;はFireWorks(UB)につながります。 – sameerkn

+1

OPはそれが間違っていることを知っている、なぜコンパイラはエラーを発生させないのですか? ) – slawekwin

+0

'エラー:ISO C++はゼロサイズの配列を禁止しています '' [-Wpedantic] int a [0]; ' – Praveen

答えて

0

それは良いコンパイラの場合は、それはそれをキャッチし、警告を与えるこの

What happens if I define a 0-size array in C/C++? に見てください。 しかし、ペタニックオプションコンパイラでそれをキャッチすることができます。

0

これは許可されていません。それはの定義されていない動作です。

おそらく、あなたのプログラムでは、あなたの現在の位置の前にあるスタックでメモリを使います。それはMemorySanitizerによって検出され、2バイト以上をオフセットすると、最終的にリターンアドレスを上書きします。それはコアダンプにつながるでしょう。

5

それは例の打ち鳴らすの出力に対して警告を発行:

warning: zero size arrays are an extension [-Wzero-length-array] 

これは未定義の動作です:

a[0] = 10; 
    a[1] = 20; 

ゼロ長配列は、gccのための拡張で、なぜ - あなたはここでそれを読むことができます:

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

They are very useful as the last element of a structure that is really a header for a variable-length object:

これは実際にはCの拡張機能ですが、この拡張機能を使用するCの既存の構造を簡単に使用できるようにするために、C++でも使用されているようです。

+0

このタイプの構造の移植性の高いソリューションは、サイズのない配列、 'a []'のようなものです。これはC99で追加されています:http://stackoverflow.com/a/17185530/3742943 – LoPiTaL

関連する問題