신기한 포인터 ㅡㅡ;;
글쓴이: Lipton / 작성시간: 금, 2006/03/10 - 3:39오전
const 로 변수를 선언한 다음에
포인터로 그 변수를 가리키고 값을 바꾸면 어떻게 되나 보았습니다.
#include <iostream>
using namespace std;
void main()
{
const int Num=10;
int *pNum = (int*)&Num;
*pNum = 100;
cout << Num << endl;
cout << *pNum << endl;
}
Num 변수를 const로 10으로 선언하고 pNum이 Num을 가리키게 해놓았씁니달
그리구 *pNum값을 100으로 수정하고 실행했습니다. GOGO~~
컴파일시에는 에러도 경고도 없네요? (VC++ 6.0)
결과:
10
100
값이 안바뀌길래 주소를 보았습니다.
pNum은 분명히 Num의 주소를 가리키고 있었습니다.
pNum에 100 값을 넣고 나서도 주소는 그대로이고
*pNum은 물론, Num까지도 100 으로 바뀌어 있었습니다.
근데 cout으로 출력하면 10 이 나오네요. 아왜~
디버깅창에 워치를 보면 값이 100인데... 출력하면 10이라니
Num과 pNum이 주소값이 같은데 하나는 10이 나오고 하나는 100이 나온다니
아따 신기하네요 ㅡㅡ;; 왜이런걸까요?
Forums:
그건 아마도
그건 아마도 compiler의 optimization때문이라고 생각이 드는데요.
Num이 const로 선언되었기 때문에, compiler가 Num을 상수라고 생각하고
Num이 사용되는 곳에서 Num을 그 상수 값으로 치환하게 되죠.
그래서
cout
은
될대로 되라지..
c로 돌려봤습니다.
#include
void main()
{
const int Num=10;
int *pNum = (int*)&Num;
*pNum = 100;
printf("%d\n",Num);
printf("%d\n",*pNum);
}
출력결과는:
100
100
이 나오네요. (VC++ 6.0)
컴파일러의 정책 차이겠죠?
C와 C++에서 const 참고
먼저, void main()이 아니라 int main()입니다.
그리고 i = i++ + ++i;와 같이, undefined behavior이기 때문에, 고민할 필요없이, 그런 코드를 쓰지 않으면 됩니다.
C와 C++에서 const 참고 바랍니다.
아울러 C FAQ 11.3 The const qualifier도 참고바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
음
상수여서 10으로 바꿔버린다는 jyoung님 말씀이 맞았습니다. !!
그리고 khiny님이랑 저랑 뭐가 틀린걸까요 저는 C로해도 똑같이 10, 100나오던데 ㅠ
심심해서 해본겁니다 ㅋㅋ const에 실수가 아닌이상 값을 넣을 이윤 없겠죠?^^
참조하세요.
http://blog.naver.com/mtbmika?Redirect=Log&logNo=110001645388
어차피 그렇다면 C 상수제거 캐스팅이나 C++ 상수제거 캐스팅이나 같은 결과여서일듯...
즉 무적의 Undefined...
댓글 달기