2012-05-25 4 views
14

可能性の重複:
May I treat a 2D array as a contiguous 1D array?二次元配列にアクセスするのは正当なものですか?

次のコードを考えてみましょう:

int array2d[10][10]; 
int *array1d = array2d[0]; 

を私はそれが動作しない実装のことを聞いたことはありませんが、それはへの法的ですアクセスして操作しますarray2d経由でarray1d?規格のどの部分でこれが可能ですか?標準では、実装が2番目のレベルの配列のそれぞれの間に余分なスペースやパディングを挿入するのを防ぐことはできますか?

ボーナスの質問array2dにアクセスする方法はありますかint[100]reinterpret_castまたはCスタイルのものは必要ありませんか?

+0

これは、内部的に1次元配列として格納するクラスにはいつでもラップできます。 – chris

+3

C++難読化コンテストにサインアップしました:)? – ScarletAmaranth

+1

'int * array1d = array2d [0];'もう少し簡単ですか? – ildjarn

答えて

5

メモリが提供されている場合、標準はこれを正式に定義されていない動作の例として示していますが、基本的には常に動作します。 [編集:C99、§J.2(未定義の動作):

  • 配列の添字が範囲外である、オブジェクトが 与えられた添字と明らかにアクセス可能であっても、(ここで私が考えていたものです左辺値の式のように、[1]〜[7]のint宣言 与えられた[4] [5])

私はありませんあなたが取得しているように、しかし適用される完全特定配列の先頭のアドレスをunへの単純なポインタに変換する配列の要素間にパディングを挿入することはできません。配列は連続している必要があります。これは、intの配列を持っているかどうかに関係なく、配列の配列にも当てはまります。

0

これは実際には合法です。この規格では、多次元配列が単純により大きな1D配列であることを明確に述べています。手渡す正確な見積りはありませんが、それが正しいことは分かります。

+0

私は最近、2D配列のレイアウトで標準語を掘りました(答え[ここ](http://stackoverflow.com/questions/10618473/is-this-c-code-portable-assuming-multidimensional-arrays-have-continuous-mem/10618866#10618866))。配列 'T [n]'が*正確に 'n * sizeof(T)'を占める部分がどこにあるのかわかりません。 – Jon

+0

基本的に、最初の引用符の "contains"は私を少し緊張させます。なぜより強い言葉遣い? "Contains"は下限を示します。 – Jon

+2

@Jon C++ 2003、§5.3.3/ 2: 'sizeof':配列に を適用すると、結果は配列の合計バイト数になります。これは、n 要素の配列のサイズが要素のサイズのn倍であることを意味します。 –

関連する問題