以下代码是否调用未定义的行为(由于别名违规或其他原因)?
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
将是指向同一类型的指针,因此允许彼此别名。
编辑:有趣的结果是,如果这实际上是一个别名违规,那么它似乎是一种在restrict
C99 之前获得语义的 hackish 但有效的方法。如:
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 等作为不同的大小。