Вызывает ли следующий код неопределенное поведение (из-за нарушения псевдонима или иным образом)?)
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
будут указателями на один и тот же тип и, таким образом, могут быть псевдонимами друг друга.
Изменить: Интересным следствием, если это на самом деле нарушение псевдонима, является то, что это кажется хакерским, но действенным способом получить ограничить семантику
до 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 и т. д. в качестве различных размеров.