공부/C || C++

char*를 cout으로 출력할 경우 주소가 올바르게 나오지 않는 경우

sudo 2021. 7. 9. 19:10

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

 

char * 타입의 주소 출력 문제

1. 문제 확인 및 테스트

bigpel66.oopy.io