次のコードは、(エイリアス違反などの理由で)未定義の動作を呼び出しますか?配列ポインタのエイリアシング - 未定義の動作?
int foo(int (*a)[10], int (*b)[5])
{
(*a)[5]++;
return (*b)[0];
}
int x[10];
foo(&x, (int (*)[5])&x[5]);
a
とb
が同じタイプへのポインタであり、従って、エイリアス互いにせてしまうためではなくポインタ・ツー・アレイタイプより普通int *
を使用して、対応するコードは、完全に合法であろうことに留意されたいです。
編集:興味深い結果、これは実際にはエイリアシング違反であれば、restrict
セマンティクス事前C99を取得するためのハックが、有効な方法であると思われることです。以下のように:あなたは、各アドレスに実際の配列にアクセスするために必要なおそらく場合
void some_func(int *aa, int *bb)
{
int (*a)[1] = (void *)aa;
int (*b)[2] = (void *)bb;
/* Now **a and **b can be assumed by the compiler not to alias */
}
、あなたは、異なるサイズとしてSIZE_MAX-1およびSIZE_MAX-2などを使用することができます。
これらは同じタイプのポインタです。エイリアスではないとみなすことはできません。 –