Вызывает ли следующий код неопределенное поведение (из-за нарушения псевдонимов или иным образом)?
int foo(int (*a)[10], int (*b)[5])
{
(*a)[5]++;
return (*b)[0];
}
int x[10];
foo(&x, (int (*)[5])&x[5]);
Обратите внимание, что соответствующий код, использующий простые int *
, а не типы указатель на массив, был бы совершенно допустимымпотому что a
и b
будут указателями на один и тот же тип и, таким образом, позволят псевдонимы друг другу.
Edit: Интересное следствие, если это на самом деле нарушение псевдонимовЭто то, что это кажется хакерским, но верным способом получить семантику 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 и т. Д. В качестве различных размеров.