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