작은 코드 UB입니까?초기화되지 않은 변수 UB의 주소를 사용하고 있습니까?
void Test()
{
int bar;
printf("%p", &bar);
}
IMO UB가 아니지만 다른 의견이 필요합니다.
bar
이 초기화되지 않은 경우에도 주소는 단순히 bar
의 주소를 인쇄합니다.
작은 코드 UB입니까?초기화되지 않은 변수 UB의 주소를 사용하고 있습니까?
void Test()
{
int bar;
printf("%p", &bar);
}
IMO UB가 아니지만 다른 의견이 필요합니다.
bar
이 초기화되지 않은 경우에도 주소는 단순히 bar
의 주소를 인쇄합니다.
TL : DR 아니, 당신의 코드는 당신이 생각 하듯이, 초기화되지 않은 것도 를 사용하여 UB를 호출하지 않습니다.
A (NY) 변수의 주소 (자동이 경우) 정의 값을 가지므로 무관 변수 자체 초기화 여부와, 변수의 어드레스는 정의 값. 그 값을 사용할 수 있습니다. (당신이 포인터를 다루는 두 번 역 참조를 수행하지 않는 경우 . :)) 엄밀히 말하면 말했다
이, 당신은
%p
로
printf("%p", (void *)&bar);
를 작성해야는 void
에 형 포인터의 인수를 기대 가변적 인 함수 인 printf()
인 경우에는 프로모션이 수행되지 않습니다 (변환). 그렇지 않으면 잘 정의 된 동작입니다.
C11
장하는 것은 §7.21.6.1
p
인수는void
에 대한 포인터한다. [.....]
'void *'는 어떤 포인터 형과도 호환되지 않습니까? –
@MichaelWalz 어떻게? –
@MichaelWalz, 어떤 포인터도'void *'형으로 변환 될 수 있지만'printf()'에 대한 두 번째 및 후속 인수와 같은 가변 인수에 대해서는 변환이 일어나지 않습니다. –
이 동작은 잘 정의되어 있습니다.
변수의 주소를 알고 있습니다. 명시 적으로 초기화되지 않았다는 사실은 중요하지 않습니다.
이 작은 코드는 UB입니까? 변환 지정자
p
이void
-pointer을 필요로하기 때문에
예, 그것은 UB를합니다. bar
의 어드레스가 아니라 자체 초기화있어 독립적 bar
여부 정의한 바와
한편 아래 코드 UB
void Test(void)
{
int bar;
printf("%p", (void*) &bar);
}
을 호출하지 않는다.
'printf ("% d", bar)는 어떨까요? 정의되지 않은 것과 불확정 한 것 사이를 구별하는 몇 가지 토론을 기억합니다 ... –
'printf ("% p", &bar);'->'printf ("% p", (void *) &bar);'이것은 아마도 질문의 핵심은 아니지만 C 표준은 그것을 요구한다. – usr
@EugeneSh.'printf ("% d", bar);'틀림없이 UB이면,'bar'의 주소에있는 메모리를 출력 할 것이다. –