reinterpret_cast를 이용해서 int*를 char*로 cast해서 주솟값을 std::cout을 이용해서 확인해보니 주솟값이 출력이 안되는 경우가 있었다. 처음엔 reinterpret_cast에 대해서 내가 잘 모르는게 있는줄 알고 열심히 찾아봤는데 그게 아니고 <iostream>헤더 중에서도 출력과 관련 있는 <ostream>에 대해 내가 모르는게 있었다.
C++에서 <ostream>을 이용해서 아래 코드처럼 char*의 주솟값을 출력하려고 하면 아무것도 출력되지 않는다.
int memory[10]{ 1,2,3,4,5,6,7,8,9,10 };
int main()
{
int* p = memory;
char* c = reinterpret_cast<char*>(p);
cout << "addr of c: " << c << endl;
}
왜냐하면 ostream 이용시 C++에서는 char*를 문자열로 인식해서 C++ 특성상 문자열의 끝을 나타내는 '\0'전까지 출력하기 때문이다. 당연히 char*에는 '\0'이 없으므로 문자열이 아직 끝이 나지 않았다고 생각하고 빈칸을 출력하는 것이다.
double*나 int*의 주솟값을 출력하는데는 문제가 없지만 char*에서만 이런 문제가 생긴다.
따라서 이때는 reinterpret_cast<void*>를 이용해서 void*로 cast한 후에 출력하면 문제없이 출력되는걸 확인 할 수 있다.
int memory[10]{ 1,2,3,4,5,6,7,8,9,10 };
int main()
{
int* p = memory;
char* c = reinterpret_cast<char*>(p);
cout << "addr of c: " << reinterpret_cast<void*>(c) << endl;
}
Reference
https://bigpel66.oopy.io/library/cpp/etc/5
'공부 > C || C++' 카테고리의 다른 글
C++ 11 default, delete 키워드 (0) | 2021.07.15 |
---|---|
C++ 11 enum class (0) | 2021.07.10 |
C++ 전처리기(preprocessor) (0) | 2021.07.08 |
C+ 11 스마트 포인터(unique_ptr, shared_ptr, weak_ptr) (0) | 2021.07.07 |
C++ 오버로딩(overloading) vs 오버라이딩(overriding), 가상함수(virtual function) 그리고 다형성(polymorphism) (0) | 2021.07.05 |