IT story

“int * ptr = int ()”값 초기화가 어떻게 불법이 아닌가?

hot-time 2020. 9. 13. 11:49
반응형

“int * ptr = int ()”값 초기화가 어떻게 불법이 아닌가?


다음 코드 ( 여기에서 가져옴 ) :

int* ptr = int();

Visual C ++에서 컴파일하고 포인터를 값 초기화합니다.

어떻게 가능합니까? 내 말 int()은 유형의 객체를 산출 하고 포인터에을 int할당 할 수 없음을 의미합니다 int.

위의 코드가 불법이 아닌 이유는 무엇입니까?


int()값이 0 인 상수 표현식이므로 널 포인터 상수를 생성하는 유효한 방법입니다. 궁극적으로 약간 다른 표현 일뿐입니다.int *ptr = NULL;


때문에 int()수율 0로 교체이다 NULL. NULL자체로 정의 0C 년대와는 달리 NULL입니다 (void *) 0.

이것은 오류입니다.

int* ptr = int(5);

그리고 이것은 여전히 ​​작동합니다.

int* ptr = int(0);

0특수 상수 값이므로 포인터 값으로 처리 할 수 ​​있습니다. 수율하는 정수 표현 0등이뿐만 1 - 1아니라 널 포인터 상수로 사용할 수 있습니다.


표현식 int()은 기본값으로 초기화 된 상수 인 정수로 평가되며 값은 0입니다.이 값은 특별합니다. NULL 상태에 대한 포인터를 초기화하는 데 사용됩니다.


n3290 (C ++ 03은 유사한 텍스트 사용)에서 4.10 포인터 변환 [conv.ptr] 단락 1 (강조는 내 것임) :

1 널 포인터 상수는 0으로 평가되는 정수 유형의 정수 상수 표현식 (5.19) prvalue 또는 std :: nullptr_t 유형의 prvalue입니다. 널 포인터 상수는 포인터 유형으로 변환 될 수 있습니다. 결과는 해당 유형의 널 포인터 값이며 오브젝트 포인터 또는 함수 포인터 유형의 다른 모든 값과 구별 할 수 있습니다. 이러한 변환을 널 포인터 변환이라고합니다. [...]

int()0으로 평가되는 정수 유형의 정수 상수 표현식 prvalue이므로 포인터 유형을 초기화하는 데 사용할 수 있습니다. 보시다시피, 0는 특수한 경우에만 적분식이 아닙니다.


int는 객체가 아닙니다.

나는 여기서 일어나는 일이 int *가 int ()에 의해 결정된 일부 메모리 주소를 가리 키도록 지시하고 있다고 믿습니다.

따라서 int ()가 0을 생성하면 int *는 메모리 주소 0을 가리 킵니다.

참고 URL : https://stackoverflow.com/questions/8067897/how-is-int-ptr-int-value-initialization-not-illegal

반응형