以下代碼是否會調用未定義的行爲(由於別名違規或其他原因)?數組指針別名 - 未定義的行爲?
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
將指向同一類型且因此允許別名彼此。
編輯:有趣的結果,如果這其實就是一個混疊違規,是它似乎是一個hackish的,但有效的方式來獲得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等爲不同的尺寸。
它們是指向相同類型的指針,它們不能被假定爲別名。 –