2012-04-20 47 views
8

0要素が未割り当てポインタと同じ配列ですか?0要素の配列

int arr[0];int* arr;と同じですか?

編集:私はこれに似た何かをやったらどう:

int x[0]; 
int* const arr = x; 

を、私はこのコードを試してみました、それはコンパイル。私の知る限りでは、xとarrはメモリ内の同じ場所を指しているはずです。この場合の違いは何ですか?

+1

ポインタは常に新しいものを指すことができますが、配列は静的に定義されます。 – chrisaycock

答えて

13

まったくありません。

arr [0]の場合、arrには明確なアドレスがあります。

* arrの場合、のarrは初期化されていません。

あなたが直前に定義された配列で ARR のconstを初期化し、あなたのEDIT、後:ちょうど変数の内容には差がないだろうが、アクションで、あなたはそれらを実行するために許可されます。

+0

int * const arrはどうですか? – Dasaru

+0

@ダサルあなたはそれを試しましたか?それはコンパイルされません。 –

+0

@Dasaru:通常は可能ですが、constのように、** arr **を特定のメモリ位置に手動で初期化する必要があります。 http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-the-constructor-initializer-rather-than –

0

長さゼロの配列は、特定のアドレス、つまり配列の先頭を指します。配列の終わりの後、未定義のデータがあります(この場合は、指し示されたアドレスにあります)。これが有用である

int arr[0]; 
int* ptr; 

// arr is a reliable value; 
// *arr is not; 
// ptr is not; 

一つの方法:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

境界外の配列アクセスが単純にUBであるため、この使用法が実際に標準に準拠しているかどうかについてのコンセンサスはまだありません(ソフトウェアのバグ、これは単なる仮説ではない)。 –

+0

@ KonradRudolph C90では、 'int arr [0]'は構造体を含めて違法であるという疑いはありませんでした。そして、配列が 'int arr [1];'と宣言され、あなたがインデックス2でアクセスした場合、それは未定義の振る舞いであったことは明らかでした。 C99ではなく、C++ではstructの最後のメンバーを 'int arr [];'として宣言してこの使用法をサポートすることができます(しかし 'int arr [0];'はエラーのままです)。 –

+0

@Jamesああ、そうだった。では、C++はどうですか?範囲外の配列へのアクセスは決して合法ではないと私は確信しています。 –

4

Aは、局所的に、それが割り当てられていないポインタと同じではないので、長さゼロの配列は、C++で違法であると宣言。