다음 코드는 별칭 위반 등의 이유로 정의되지 않은 동작을 호출합니까? a
및 b
동일한 유형에 대한 포인터 수 있으므로 별명 서로 허용 때문에 일반 int *
보다는 포인터 - 어레이 유형을 사용하여 해당 코드가 완벽하게 합법적 될 것이라고배열 포인터 앨리어싱 - 정의되지 않은 동작?
int foo(int (*a)[10], int (*b)[5])
{
(*a)[5]++;
return (*b)[0];
}
int x[10];
foo(&x, (int (*)[5])&x[5]);
참고.
편집 :이 사실 앨리어싱 위반 인 경우 흥미로운 결과는, 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 등을 사용할 수 있습니다.
이들은 동일한 유형의 포인터이며 별칭이 아닌 것으로 간주 될 수 없습니다. –