2009-08-08 2 views
0

C++에 대한 나의 이해가 잘못되었다고 확신 할 수 없다. 나는 1) 모든 0이 아닌 값은 TRUE와 같고 0은 FALSE와 같다. 2) 널 포인터는 0으로 저장됩니다.C++ 제로 (null) 포인터가 false를 반환해야합니까?

그러나이 같은 코드 :

void ViewCell::swapTiles (ViewCell *vc) { 
    ViewTile *tmp = vc->tile(); 
    [stuff ...] 
    if (tmp) addTile(tmp); 
} 

나에게 널 포인터를 역 참조에서 세그먼트 폴트를 제공하지만,

if (tmp != 0) addTile(tmp); 

잘 작동합니다. 왜 그런가?

+3

하드웨어 측면에서 null 포인터를 0으로 표시 할 필요는 없지만 컴파일러는이 문제를 해결합니다. –

답변

8

포인터의 경우 p(p != 0)은 정확히 같습니다. 만약 당신에게 segfault를 준다면 일반 포인터가 아니거나 다른 곳에서 문제가 발생합니다.

+0

네, 네가 맞다고 생각해. 코드의 다른 부분을 수정 한 후 내 문제가 사라진 것처럼 보입니다. 비록 그것이 처음에 어떻게 일어 났는지에 관해 아주 명확히하지 않는다. – int3

+0

컴파일러 코드 생성 버그? 아니면 세고 폴트가 정말로 다른 곳 이었습니까? – pjc50

1

C++ 0 포인터는 반드시 모든 제로 비트 패턴으로 저장되지는 ​​않지만 토큰 0은 항상 0 포인터로 해석됩니다. 컴파일러는 포인터라고 생각하고 컴파일러가 유형 변환이 필요한 정수라고 생각하면 정수 0은 항상 0 포인터 (가능하면 다른 비트 패턴 포함)로 강제 변환됩니다. 그리고 다른 것들에 대한 포인터는 다른 sizeof를 가질 수 있으며, 정수보다 다른 sizeof가 될 수도 있습니다. 그러나 그것이 어떻게 작동하는지 볼 수 있습니다. 보통. 명확한?

+0

그것은 물을 너무 혼잡스럽게 삭제할만한 가치가 있습니다. 당신이 말한 것은 기술적으로 사실 일지 모르지만, 원래의 질문에 관해서는 새로운 사람들에게 혼란 스러울 정도로 심하게 설명합니다. 다시 팩터링하거나 삭제하십시오. –

+1

정수 0이 항상 널 포인터로 강제 변환되는 것은 아닙니다. 예를 들어,'int n = 0; void * p = (void *) n;'은 U.B.이고, 특히'p'가 널 포인터가 될 필요는 없습니다. 정수 리터럴 0 만 설명한대로 널 포인터로 처리 할 수 ​​있습니다. –

+0

그는 '클래스'멤버 유형에 대한 포인터에 이상한 0 비교가 있다고 가정합니다. –

관련 문제