2016-10-07 7 views
3

작은 코드 UB입니까?초기화되지 않은 변수 UB의 주소를 사용하고 있습니까?

void Test() 
{ 
    int bar; 
    printf("%p", &bar); 
} 

IMO UB가 아니지만 다른 의견이 필요합니다.

bar이 초기화되지 않은 경우에도 주소는 단순히 bar의 주소를 인쇄합니다.

+0

'printf ("% d", bar)는 어떨까요? 정의되지 않은 것과 불확정 한 것 사이를 구별하는 몇 가지 토론을 기억합니다 ... –

+4

'printf ("% p", &bar);'->'printf ("% p", (void *) &bar);'이것은 아마도 질문의 핵심은 아니지만 C 표준은 그것을 요구한다. – usr

+1

@EugeneSh.'printf ("% d", bar);'틀림없이 UB이면,'bar'의 주소에있는 메모리를 출력 할 것이다. –

답변

7

TL : DR 아니, 당신의 코드는 당신이 생각 하듯이, 초기화되지 않은 것도 를 사용하여 UB를 호출하지 않습니다.


A (NY) 변수의 주소 (자동이 경우) 정의 값을 가지므로 무관 변수 자체 초기화 여부와, 변수의 어드레스는 정의 값. 그 값을 사용할 수 있습니다. (당신이 포인터를 다루는 두 번 역 참조를 수행하지 않는 경우 . :)) 엄밀히 말하면 말했다

, 당신은

%p
printf("%p", (void *)&bar); 

를 작성해야는 void에 형 포인터의 인수를 기대 가변적 인 함수 인 printf() 인 경우에는 프로모션이 수행되지 않습니다 (변환). 그렇지 않으면 잘 정의 된 동작입니다.

C11 장하는 것은 §7.21.6.1

p 인수는 void에 대한 포인터한다. [.....]

+0

'void *'는 어떤 포인터 형과도 호환되지 않습니까? –

+0

@MichaelWalz 어떻게? –

+0

@MichaelWalz, 어떤 포인터도'void *'형으로 변환 될 수 있지만'printf()'에 대한 두 번째 및 후속 인수와 같은 가변 인수에 대해서는 변환이 일어나지 않습니다. –

2

이 동작은 잘 정의되어 있습니다.

변수의 주소를 알고 있습니다. 명시 적으로 초기화되지 않았다는 사실은 중요하지 않습니다.

4

이 작은 코드는 UB입니까? 변환 지정자 pvoid -pointer을 필요로하기 때문에

예, 그것은 UB를합니다. bar의 어드레스가 아니라 자체 초기화있어 독립적 bar 여부 정의한 바와

한편 아래 코드 UB

void Test(void) 
{ 
    int bar; 
    printf("%p", (void*) &bar); 
} 

을 호출하지 않는다.