2011-02-16 2 views
3

나는 단순한 bool 포인터 클래스 멤버를 사용합니다. 거짓 응답 할당. true는 다른 동작을합니다. 코드의 주석을 참조하십시오. 아래 다른 하나를 테스트하기 위해 하나를 주석 처리하십시오.bool 포인터 멤버 동작이 true와 vs가 다를 때

나는 변환이 false에서 0에 존재하기 때문에입니다 컴파일러 호출 g++ -o basic basic.cpp

class Test 
{ 
public: 
    int a; 
    bool* abool; 
}; 


int main() { 
    Test t; 

    //t.abool = false;    // WORKS 
    //t.abool = true;    // ERROR: cannot convert 'bool' to 'bool*' in assignment - expected IMO; 

    // this should work for both values IMO 
    //*(t.abool) = true;   // Segmentation fault 
    //*(t.abool) = false;   // Segmentation fault 



    cout << t.abool << endl; 

    return 0; 
} 
+0

있어. thx 얘들 아! – groovehunter

답변

10

를 사용합니다. 따라서 t.abool = 0;이되어 aboolNULL으로 초기화합니다. 그러나 true1으로 변환되며 포인터를 절대 정수로 초기화 할 수 없으므로 컴파일러 오류가 발생합니다. 두 번째 경우 (주석이 있으면 IMO가 작동해야 함) 정의되지 않은 동작을 호출하는 단위 화 된 포인터를 역 참조하려고 할 때 seg 오류가 발생합니다.

6

당신은 bool*을 가리키는 초기화되지 않았습니다. 그것은 실제 bool 개체를 가리키는 일단 당신이 bool 값을 할당 할 수 있습니다

bool test; 

t.abool = 0; // or NULL 
t.abool = &test; 

:

당신은 그것을 bool 개체에 널 포인터 값 (false에 변환됩니다), 또는 유효한 포인터를 할당 할 수 있습니다 포인터를 통해 해당 객체 : 거짓 때문에

*t.abool = true; 
*t.abool = false; 
1

거짓 작품은 아마 g ++

에 의해 0로 볼 수 있습니다
+0

여기에는 확률이 없습니다. – GManNickG

1

숫자 유형 및 값이 0 인 리터럴은 암시 적으로 널 포인터로 변환 될 수 있습니다. bool은 숫자 유형이고 false 값은 0입니다. 0이 아닌 값 (예 : true)은 내재적으로 포인터로 변환 될 수 없습니다.

관련 문제