cout 문자 포인터와 int 등 포인터의 해석

5025 단어 포인터

문제의 출처


뉴커넷 토론방에서 어떤 사람이 이런 문제 코드를 제기했다.
char *p  = NULL;
cout << p;
******
int *q = NULL;
cout << q;

상기 코드는 윈도우즈 아래에서 vs 사용하는데 하나는 틀리고 하나는 틀리지 않습니다~하지만 linux 아래에서는 틀리지 않습니다~

추측하다

  • 문자 포인터는 포인터가 가리키는 값(문자열)을 직접 인쇄하여 빈 포인터의 내용에 접근한다.
  • int 포인터, 출력은 인쇄 포인터의 값(null=0)이기 때문에 틀리지 않습니다.
  • linux 아래에서 오류가 발생하지 않습니다. 그것은 틀림없이 서로 다른 컴파일러의 처리가 다르기 때문입니다~
  • 확인

  • 프로그램은 ubuntu 14.04 달리기, g++ 사용
  • 윈도우즈 밑에 가서 검증하지는 않았지만 다른 사람이 비슷한 프로그램을 실행한 결과를 봤어요.
    절차는 다음과 같습니다.
  • #include<iostream>
    #include<cstring>
    using namespace std;
    int main()
    {
        char a[] = "hello,world!";
        cout << "a's address is " << &a << endl;
        char *p = a;
        cout <<"the p's value is: " << (void *)(p) << endl;
        cout << "the content is: " << p << endl;
    
        p = NULL;
        cout <<"the p's value is: " << (void *)(p) << endl;
        cout << "the content is: " << p << endl;
        if(cout.bad()) {        
            cout.clear();
            cout << endl;
            cout << " If @p __sb is NULL, the stream will set failbit in its error state." << endl;
        }
    
    
        int *q = NULL;
        cout <<"q's value is " << q << endl;
        cout << "the content is " << *q << endl;
        return 0;
    }

    컴파일 실행:
    zy@zyPc:~/code/C/pointer$ ./a.out 
    a's address is 0xbf897d7f
    the p's value is: 0xbf897d7f
    the content is: hello,world!
    the p's value is: 0
    the content is: 
      If @p __sb is NULL, the stream will set failbit in its error state.
    q's value is 0
        (     )

    결론

  • 추측한 바와 같이cout의 <<<다시 불러올 때char*와 int*의 출력 해석이 다르다
  • g++는 빈 문자 포인터를 만났을 때 오류 상태에서fallbit로 설정합니다. 이것은 원본 코드를 보면 찾을 수 있습니다.
  • /**
  • @brief Extracting from another streambuf.
  • @param __sb A pointer to a streambuf *
  • This function behaves like one of the basic arithmetic extractors,
  • in that it also constructs a sentry object and has the same error
  • handling behavior. * * If @p __sb is NULL, the stream will set failbit in its error state. *
  • Characters are extracted from @p __sb and inserted into @c *this
  • until one of the following occurs: *
  • the input stream reaches end-of-file,

  • insertion into the output sequence fails (in this case, the

  • character that would have been inserted is not extracted), or
  • an exception occurs while getting a character from @p __sb, which

  • sets failbit in the error state *
  • If the function inserts no characters, failbit is set. */ __ostream_type& operator<<(__streambuf_type* __sb);
  • 좋은 웹페이지 즐겨찾기