C標準の未定義動作の例の1つは、(J.2)を読み取ります。
—指定された添え字でオブジェクトに明らかにアクセスできる場合でも、配列の添え字が範囲外です(宣言int a[4][5]が与えられた左辺値式a[1][7]のように)(6.5.6)
宣言がからint a[4][5]
に変更された場合でもunsigned char a[4][5]
、アクセスするa[1][7]
と未定義の動作が発生しますか?私の意見ではそうではありませんが、反対する人から聞いたことがあるので、SOの専門家になる他の人がどう思うか見てみたいと思います。
私の推論:
6.2.6.1段落4および6.5段落7の通常の解釈では、オブジェクトの表現
a
はsizeof (unsigned char [4][5])*CHAR_BIT
ビットであり、オブジェクトとオーバーラップする型の配列としてアクセスできunsigned char [20]
ます。a[1]
unsigned char [5]
は左辺値として型を持ちますが、式で([]
演算子のオペランドとして、または同等にの+
演算子のオペランドとして*(a[1]+7)
)使用されると、型のポインターに減衰しますunsigned char *
。の値は、の形式
a[1]
の「表現」のバイトへのポインタでもあります。このように解釈すると、に7を追加することが有効です。a
unsigned char [20]
a[1]