valid pointer 체크하는 코드 질문입니다.
글쓴이: serphine / 작성시간: 월, 2008/04/21 - 10:12오전
보통 pointer가 유효한지 검사하는 매크로를 다음과 같이 쓰는데요..
#define IS_VALID_POINTER(p) (((p) != NULL) && ((void *)(p) != (void *)-1))
앞의 p != NULL 부분은 알겠는데, 뒤의 ((void *)(p) != (void *)-1) 부분은 어떤 뜻인가요?
두가지가 궁금합니다.
1. -1과 비교하는 이유
즉, 음수 전체가 아니라 -1 하나만 체크하는 이유가 궁금합니다.
2. void 포인터로 캐스팅하는 이유
즉, 0일 경우는 안 맞쳐도 되고 -1일 경우에만 맞추는 이유가 궁금합니다.
고수님의 명쾌한 답변 기다릴께요^^;
Forums:
컴파일러마다 조금씩
컴파일러마다 조금씩 다르지만 초기화하지 않은 포인터를 컴파일러가 -1로 초기화하는 경우가 있습니다.
그럴때 체크할려고 하는 용도같군요.
표준은 아니기 때문에 항상 저런 체크가 유효하다고는 장담하기 힘들듯 합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
아.. 초기화되지
아.. 초기화되지 않았을 때 자동으로 -1로 초기화되는 경우를 고려한 거군요..
감사합니다^^;
0은 표준에 의해 널
0은 표준에 의해 널 포인터로 변환가능하므로 void *로의 캐스팅이 필요치 않습니다.
--
돼지군 작업실: 4word 64bit OS, IMPerator, SMPlayer 한국어 번역, ...
대전월평중 2 / Ubuntu Hardy / 070) 7594-3258 / 서명 변경일 2008/4/9
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
포인터가 가리키는
포인터가 가리키는 값이 아니라, 포인터의 주소를 비교하는데에도 캐스팅이 필요한가요?
포인터 값 자체는 모두 unsigned int 아닌가요?
즉, 예를 들어
*(char *)p != *(char *)q
이런 식으로 포인터가 가리키는 값을 비교하고자 할때는 캐스팅을 하는 것이 이해가 가는데
포인터 값 자체를 비교할 때도 캐스팅이 필요한 것이 이해가 안됩니다.
모든 비교 연산은
모든 비교 연산은 타입이 같아야합니다.
타입이 다른데도 비교가 가능한것은 비교직전에 conversion이 일어나기때문입니다.
표준에 의해서 자동으로 변환 가능한 경우는
implicit type convesion이라고 부릅니다.
implicit type conversion을 이용해서 같은 타입으로 맞출 수 없다면
컴파일 타임에서 에러가 납니다.
처음 답변대로 0은 implicit type conversion에 의해서
p와 같은 포인터 타입으로 변환된 후에 비교가 됩니다.
하지만 (-1)은 그럴수 없기때문에 explicit type conversion 해주어야합니다.
-1은 16진수로 ffffffff 입니다.
visual c 같은 경우 debug 모드에서 이렇게 초기화를 해줬던것 같습니다.
--
포인터의 값 자체는 unsigned int가 아니냐는 질문에 대해서
포인터의 타입은 포인터고, unsigned int의 타입은 unsigned int죠..
모든 변수의 값 자체는 메모리 내에 들어있는 이진수이고요..
값 자체를 비교하는게 아니라 "타입을 가진 변수"들을 비교하는것이고,
C나 특히 C++은 strict type checking을 하는 언어입니다.
모든 비트가 0이 아닌
모든 비트가 0이 아닌 null pointer가 있을 수 있기 때문에 그런 머신을 고려한 것 같습니다. 제가 확인하기론 이것은 표준이 아니라기 보다는 implementation defined입니다.
댓글 달기