에 다음 예제를 보았습니다.제한 한정자의 정의되지 않은 동작에 대한 혼동
void f(int n, int * restrict p, int * restrict q)
{
while(n-- > 0)
*p++ = *q++; // none of the objects modified through *p is the same
// as any of the objects read through *q
// compiler free to optimize, vectorize, page map, etc.
}
void g(void)
{
extern int d[100];
f(50, d + 50, d); // OK
f(50, d + 1, d); // Undefined behavior: d[1] is accessed through both p and q in f
}
이 예에서는 f(50, d + 50, d);
을 호출하는 것이 좋습니다.
하지만 이해가 안되는 전화는 f(50, d + 1, d)
입니다. 정의되지 않은 동작입니다. 왜?
함수'f'의 객체'd [1]'은'p'와'q'를 통해 접근하기 때문에. 의견은 그것을 말하고있다. –
'포인터의 수명'이 두 포인터에 영향을주는 함수 호출이기 때문에 여기서는 제한적이라고 생각하지 않습니다. 정의되지 않은 일반적인 동작은 함수'f'에서 @MartinBeckett –
에 적용됩니다. 두 포인터가 모두 제한되어 있지만 다른 시점에 같은 객체를 가리키고 있습니다. –