14

重複の可能性:
2D配列を連続した1D配列として扱うことはできますか?

次のコードを検討してください。

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

動作しない実装について聞いたことがありませんが、をarray2d介してアクセスして操作することは合法array1dですか?標準のどのセクションでこれが許可されていますか?標準には、実装が各第2レベルの配列の間に余分なスペースを挿入したりパディングしたりすることを妨げるものがありますか(必要ではありませんが、それでも)?

ボーナス質問:またはCスタイルのものを必要としないarray2dとしてアクセスする方法はありますか?int[100]reinterpret_cast

4

2 に答える 2

5

メモリが機能する場合、標準はこれを公式に未定義の動作の例として挙げていますが、本質的に常に機能します。[編集: これが私が考えていたことです: C99、§J.2 (未定義の動作):

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

ただし、配列の先頭のアドレスを取得し、それを基になる型への単純なポインターに変換しているため、それが当てはまるかどうかは完全にはわかりません。]

配列は連続している必要があるため、配列の要素間にパディングを挿入することはできません。これは、配列の配列または配列の配列のいずれであっても当てはまりintます。

于 2012-05-25T21:37:12.827 に答える
0

これは確かに合法です。標準では、多次元配列は単純に大きな 1D 配列であると明確に述べています。正確な引用文は手元にありませんが、それが真実であることは知っています。

于 2012-05-25T21:37:19.920 に答える