포인터 주솟값 출력 질문입니다.
글쓴이: jiva / 작성시간: 일, 2014/04/06 - 3:14오후
비주얼 스튜디오 2010 C++ 을 통해 여태까지 C언어공부를 해왔습니다. 그러다 최근에 리눅스를 깔게되어서 gcc를 이용해서 공부하고 있는데요, C++에서 포인터를 이용해 주솟값을 출력할 때 서식문자 %d를 이용해서 정수형으로 출력을 하게되면 아무런 경고없이 출력이 잘 되었습니다. 그런데 gcc에서 주솟값을 %d로 출력을 하니 컴파일러가 경고를 주네요, 출력은 제대로 되고 %p를 사용해야 경고가 사라지네요?
원래 C언어 표준에선 주솟값 출력할 때 %p를 사용해야 하나요? 경고메세지를 보니 %d는 int형을 기대하는데 제가 int *형의 출력을 하라고 했다고 꾸짖습니다..
Forums:
'경고'는 '에러'가 아닙니다. '경고'는 표준과
'경고'는 '에러'가 아닙니다. '경고'는 표준과 상관없이 컴파일러가 도움을 주려고 베푸는 친절입니다.
이거 참고하세요.
http://www.cplusplus.com/reference/cstdio/printf/
printf함수는 가변인자 함수이고, 따라서 %d가
printf함수는 가변인자 함수이고,
따라서 %d가 기대하는 정수형 변수의 크기와 포인터 변수의 크기가 다를 경우 문제가 생길 수 있습니다.
물론 대개의 경우에는 문제가 발생하지 않습니다.
int형의 크기와 포인터 변수의 크기가 대부분의 플랫폼에서 같기 때문입니다..
하지만 반드시 보장되는 것은 아니고, C++ 이라면 상황은 더더욱 복잡해지기 때문에,
저 경고 메시지를 진지하게 받아들이시는게 좋을 것 같습니다.
%p를 사용하던가 아니면 매개변수에 (int)p와 같이 형변환 연산자를 붙여 정수형으로 바꿔 넘겨주시는 것이 좋습니다.
참고로 가변 인자 함수는 매개변수의 default argument promotion 룰에 대해서 주의깊게 봐 두시는 것이 좋습니다.
댓글 달기