2012-05-01 2 views
0
int arr[4][2][3][6]; 

ARRのタイプ(配列名)私の知る限りではタイプ

(gdb) wha arr 
type = int [4][2][3][6] 

を検査するGDBを実行して、式(exept内のオペランドとして使用される場合'sizeof'または '&')、コンパイラは配列名を配列の最初の要素へのポインタとして扱います。

(gdb) wha arr+1 
type = int (*)[2][3][6] 

あなたが期待通りに出力されていることを確認:だから、私は私がこれを検査した場合、興味深いことにtype = int (*)[2][3][6]

を期待していました! ここで私はgdbの表示スタイルか、配列名の型は本当にint [4][2][3][6]なのですか?

ところで、私は、GDBはタイプがint [4][2][3][6]であることを特徴とする理由の推測を持っているあなたが見る、

(gdb) wha &arr 
type = int (*)[4][2][3][6] 

&arrでは、ARRがint [4][2][3][6]あるべきint [4][2][3][6]へのポインタです....

+2

あなたは何を求めていますか?配列の型はその型であり、型が崩壊する型ではありません。これは '&'演算子、 'sizeof'演算子、GCC拡張子' __typeof__'でCでも見ることができます。 –

+0

あなたの応答を考えた後、私はgdbに配列名の型を教えてもらうために、配列名自体が '式'にないことを知った!したがって、最初の要素へのポインタとして扱われません。 –

+1

ところで、+0ではなく+0を使用して値を変更せずに減衰させることができます。 –

答えて

3

コンパイラは、ポインタを必要とするコンテキストで使用する場合は、その名前を最初の要素へのポインタとして使用します。しかし、gdbはあなたが渡しているシンボルの実際のタイプについて正しいです。

arr + 1は& arr [1]であり、これは示されている3次元配列へのポインタです。

arr自体はそれらの配列です。すなわち4次元アレイである。

+1

arr + 1は&arr [1]であるはずですか?arr [1]は*(arr + 1)と等価ですので –

+0

これは正しい – inquist