피씨컴의 기울어진 공관

#include <iostream>

using namespace std;

int main(void)
{
 const int nNum = 10;
 int *p = NULL;
 p= (int *)&nNum;
 *p=20;

 cout << "nNum = " << nNum << endl;
 cout << "*p =" << *p << endl;
 cout << "&nNum = "<<&nNum << endl;
 cout << "    p = "<<p<<endl;

}

 

 

 

nNum 은 상수화 된 변수로 그 안의 값은 10 이다.

포인터 변수 p 는 nNum 의 주소로 초기화 되었다.

하지만 여기서 강제 형변환을 통해 nNum 의 주소로 포인터를 이용하여 접근,

그 값을 바꾸었다. 컴파일 결과는 정상 동작이다. 에러는 발생하지 않았다.

 

하지만 출력 결과는 보다시피 값은 바뀌지 않았다.

nNum 의 값은 바뀌지 않았고 *p 로 포인터 변수에 저장된 주소값으로 접근한 주소에 저장된 변수 값이 바뀌었다.

 

주소를 출력해 보면 주소가 동일하다. 같은 주소인데 nNum 은 10, *p 는 20 이다.

이를 통해 알 수 있는 것은 메모리 영역에서 const 를 통해 상수화 된 nNum 은 데이터 영역에 있고

*p 는 스택 영역에 있는다는 점이다. 즉 서로 다른 메모리 영역에 존재한다는 것이다.

 

동일한 주소이지만 값을 잠시 복사하여 출력하였을 뿐

참조 영역이 다르므로 서로 다른 값이 출력된 것이다.

이를 자세히 알고 싶다면 메모리 관리 방법과 원리를 알아야만 할 것이다.

하지만 자동으로 관리해 주는 부분이므로 굳이 알 필요는 없다.

위의 예제는 좋은 코드의 예가 아니므로 메모리 영역의 이해를 위한 용도 이외에는 사용하지 말자.

강제 형변환을 이용하여 혼란을 줄 수 있는 예이다.

 

C 스타일의 형변환은 위와 같이 그 위험성이 높다. 형변환에 대한 책임은 프로그래머에게 있다.

따라서 C++ 스타일의 형변환 static_cast<type-name>(변수) 를 이용하는 것이 좋다.

 

 

 

출처 : (장원석님 블로그) http://blog.naver.com/almost_crazy

'프로그래밍 > 참고' 카테고리의 다른 글

알짜배기 정보!  (0) 2013.03.07
SVN 용어설명  (0) 2013.03.07
printf, scanf  (0) 2013.02.27
#include , <stdio.h>, main  (0) 2013.02.27
문자열 관리 함수들 총집합!  (0) 2013.02.24
Posted by 피씨컴